【问题标题】:Can you chain multiple whereEqualTo operations in one query in pieces in Firestore您可以在 Firestore 中的一个查询中链接多个 whereEqualTo 操作吗
【发布时间】:2020-04-09 20:09:14
【问题描述】:

在我的应用程序中,我有一个多选对话框,其中包含用户应该能够选择的各种过滤器选项,以便根据文档的 rarity 字段过滤数据库。由于过滤器对话框中有许多选项,如果我们考虑过滤器的所有可能组合,手动覆盖每个案例将需要很长时间。考虑到这一点,我尝试创建一个起始查询,如下所示,然后我遍历用户选择的过滤器列表,并尝试将whereEqualTo("rarity",filter) 操作添加到每个过滤器的查询中。我注意到你不能像普通变量那样连接查询,例如var i += 5 所以我想知道这种问题是否有任何解决方案。 您是否可以实际应用多个 whereEqualTo 操作 分步/分段 在不覆盖之前应用的相同查询的情况下查询

这是我在收到用户在我的 FilterActivity.kt 类中选择的过滤器后所尝试的:

class FilterActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_filter)

        val db = FirebaseFirestore.getInstance()

        val filters:ArrayList<String>? = intent.getStringArrayListExtra("filterOptions")
        Log.d("FilterActivity", "filter options $filters")

        var query = db.collection("Cards").orderBy("resID")

        for(filter in filters!!) {
            query = query.whereEqualTo("rarity",filter)
        }

        query.get().addOnSuccessListener { querySnapshot ->
            if(querySnapshot.isEmpty) Log.d("FilterActivity","is empty")
            for(doc in querySnapshot.documents) {
                Log.d("FilterActivity", "${doc.getString("name")} - ${doc.getString("rarity")}")
            }
        }
    }
}

【问题讨论】:

  • 您可以根据需要链接 whereEqualTo 操作。但是这段代码有什么问题呢?
  • 当我尝试在查询对象上使用 += 运算符时,我在编译之前从 IDE 收到错误,但我看不到错误弹出窗口,因为它闪烁太快并且由于某种原因不闪烁
  • 如果应用程序崩溃,会有一个堆栈跟踪。请在 logcat 上查找,并将其添加到您的问题中。
  • @AlexMamo 问题是由于查询中的 += 运算符,该应用程序甚至无法运行。我正在使用 Run 中的日志更新我的帖子

标签: android firebase kotlin google-cloud-firestore


【解决方案1】:

您能否在 Firestore 中的一个查询中链接多个 whereEqualTo 操作

您可以根据需要链接 whereEqualTo 操作。

代码+= 运算符中的问题。您无法添加/连接两个 Query 对象。要解决这个问题,请更改以下代码行:

query += query.whereEqualTo("rarity",filter)

query = query.whereEqualTo("rarity",filter)

【讨论】:

  • 我的代码中 if 块的每次运行会覆盖之前的 whereEqualTo 操作还是隐式连接?
  • 它向whereEqualTo 添加了另一个调用。试一试。
  • 这是我遇到 += 问题时尝试的第一件事,但是当我尝试执行 query = query.whereEqualTo("rarity",filter) 时,query.get() 的结果始终为空。我再次尝试以防万一,但仍然没有结果。如果我要选择 R & N 过滤器,此代码不应该返回所有“稀有度”值为“R”或“N”的文档吗?
  • 如果您选择“R”或“N”,您将拥有一个带有“R”或“N”的过滤器。如果您想要两个过滤器,那么您应该添加两个 whereEqualTo 调用。但请记住,Firestore queries are immutable
  • 是的,我希望能够一次应用所有用户选择的过滤器,所以在这种情况下,R&N 都是 R&N。由于查询是不可变的,我无法连接它们,以便涵盖所有可能的过滤器组合,例如,在一个巨大的 if 语句中手动编写它们是唯一的解决方案吗?
【解决方案2】:

基本上,您正在尝试执行 OR 操作,在其中检索所有文档,其中稀有字段与数组中的任何值匹配。

您正在尝试新的 firebase whereIn 操作,您可以在其中传递值数组,但过滤器中有最大 10 个值的限制

 FirebaseFirestore.getInstance()
            .collection("Cards")
            .orderBy("resID")
            .whereIn("rarity",filters!!.toList())
            .get().addOnSuccessListener { querySnapshot ->
                if (querySnapshot.isEmpty) Log.d("FilterActivity", "is empty")
                for (doc in querySnapshot.documents) {
                    Log.d("FilterActivity", "${doc.getString("name")} - ${doc.getString("rarity")}")
                }
            }

filters arraylist 最多可以包含 10 个值

【讨论】:

  • 谢谢,这正是我想要的
猜你喜欢
  • 1970-01-01
  • 2014-02-03
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多