代码之家  ›  专栏  ›  技术社区  ›  Stelios Papamichail

在Firestore中,你能在一个查询中将多个whereEqualTo操作连成一个片段吗

  •  0
  • Stelios Papamichail  · 技术社区  · 6 年前

    在我的应用程序中,我有一个带有各种筛选选项的多选对话框,用户应该能够选择这些选项,以便根据 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")}")
                }
            }
        }
    }
    
    0 回复  |  直到 6 年前
        1
  •  1
  •   ked    6 年前

    基本上你是在尝试 操作,在该操作中检索所有文档,其中稀有字段匹配数组中的任何值。

    你正在尝试新的firebase whereIn 可以传递值数组的操作,但有max的限制 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个值

        2
  •  0
  •   Alex Mamo    6 年前

    在Firestore中,你能在一个查询中将多个whereEqualTo操作连成一个片段吗

    你可以根据需要在任何地方进行连锁经营。

    代码中的问题 += 操作人员无法对两个查询对象进行添加/连接。要解决此问题,请更改以下代码行:

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

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