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

时间:2019-12-17 10:30:05

标签: android firebase kotlin google-cloud-firestore

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

2 个答案:

答案 0 :(得分:1)

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

过滤器arraylist最多可以包含10个值

答案 1 :(得分:0)

  

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

您可以根据需要在EqualTo操作中进行链接。

您的代码+=运算符中的问题。您无法对两个查询对象进行添加/串联。要解决此问题,请更改以下代码行:

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

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