首页 > 解决方案 > 您可以在 Firestore 中的一个查询中链接多个 whereEqualTo 操作吗

问题描述

在我的应用程序中,我有一个多选对话框,其中包含用户应该能够选择的各种过滤器选项,以便根据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")}")
            }
        }
    }
}

标签: androidfirebasekotlingoogle-cloud-firestore

解决方案


基本上,您正在尝试执行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")}")
                }
            }

过滤器数组列表最多可以包含 10 个值


推荐阅读