【问题标题】:Query Multiple Fields-array Firestore查询多个字段 - 数组 Firestore
【发布时间】:2020-06-12 14:08:16
【问题描述】:

我的 android 应用中有一些复选框。我想根据用户选中的复选框进行 Firestore 查询。我已经设法将所有选中字段的名称添加到一个数组中。 因此,如果我的应用程序有 10 个带有名称的复选框 - 项目 1,项目 2......项目 10,并且如果用户选中框 3,4 和 10。我得到一个数组:

testArray=[item 3,item 4,item 10]

现在我想根据布尔值-true 查询这个数组。我的数据库还包含具有不同布尔值的字段,即项目 1、项目 2......项目 10。

我试过了:

FirebaseFirestore.getInstance()
             .collection("Users")
             .whereEqualTo(testArray.toString(),true)
             .get()
             .addOnSuccessListener(
   new OnSuccessListener<QuerySnapshot>() {
   @Override
   public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
     List<DocumentSnapshot> 
     snapshotList=queryDocumentSnapshots.getDocuments();
     for(DocumentSnapshot snapshot:snapshotList){
                  Log.d("TAG", "onSuccess: "+snapshot.getData());
                }
           }
     }).addOnFailureListener(
   new OnFailureListener() {
   @Override
   public void onFailure(@NonNull Exception e) {

   }});

我得到了错误:

 java.lang.IllegalArgumentException: Use FieldPath.of() for field names containing '~*/[]'.
        at com.google.firebase.firestore.util.Preconditions.checkArgument(com.google.firebase:firebase-firestore@@21.4.3:117)
        at com.google.firebase.firestore.FieldPath.fromDotSeparatedPath(com.google.firebase:firebase-firestore@@21.4.3:83)
        at com.google.firebase.firestore.Query.whereEqualTo(com.google.firebase:firebase-firestore@@21.4.3:94)
        at com.example.XX.todayQuestionFragment$1.onClick(todayQuestionFragment.java:134)
        at android.view.View.performClick(View.java:7201)
        at android.view.View.performClickInternal(View.java:7170)
        at android.view.View.access$3500(View.java:806)
        at android.view.View$PerformClick.run(View.java:27582)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7710)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)

现在我尝试使用 IDE 推荐的 FieldPath.of()。即我替换了

testArray.toString()

与:

FieldPath.of(testArray)

使用它,我没有收到任何错误,但我也没有收到我的数据。我的 logcat 在调试部分是空的。

如何进行此查询?请记住,我不知道数组的内容或大小。这取决于用户输入。问题不是从复选框获取数组,而是查询字段是数组成员的位置。 任何见解都会非常有帮助

【问题讨论】:

    标签: java android firebase google-cloud-firestore


    【解决方案1】:

    如果您有一个布尔字段并且您想测试该字段是否等于数组中的值之一,您正在寻找whereIn 函数:

    FirebaseFirestore.getInstance()
             .collection("Users")
             .whereIn("nameOfField", testArray);
    

    如果您有一个带有布尔值的数组字段,并且您想测试这些布尔值中的任何一个是否与本地数组中的任何值匹配,那么您正在寻找whereArrayContainsAny

    FirebaseFirestore.getInstance()
             .collection("Users")
             .whereArrayContainsAny("theArrayField", testArray);
    

    如果您的文档中有多个要测试的字段,则它实质上会变成WHERE field1 = true OR field2 = true

    这是 Firestore 不支持的一种查询。反对,因此您必须对每个字段执行单独的查询。


    更新事实证明,您的用例有所不同,您想要构建一个 AND 查询,Firestore 确实支持该查询。

    每次调用 where... 时,它都会返回一个 Query 对象。因此,您可以遍历您的字段,并为每个额外的复选框创建一个新的 Query

    类似:

    // Start with the full list of all users
    Query query = FirebaseFirestore.getInstance().collection("Users")
    
    // Add a condition for every value in our array
    for (int i=0; i < testArray.length; i++) {
      String field = testArray[i];
      query = query.whereEqualTo(field, true);
    }
    
    // Execute the query
    query.get().addOnSuccessListener(...
    

    【讨论】:

    • 我的本地数组包含“nameOfField”。再次使用我的示例:我想要 item 3= true & item 4=true & item 10=true 的所有文档。在我的代码中,我已经有了数组 [item3,item4,item10] 。我的数组成员对应于我的文档中字段的名称。我想使用where,但我不知道字段的名称,因为它们在我的数组中。有什么方法可以循环遍历数组的所有成员以进行查询?
    • 完美。谢谢!所以如果一个人点击5个复选框,就会有5个查询,对吧?我的意思是我会按照我的猜测收费。而且,如果我想要一个简单的query.whereEqualTo("name","George") 以及这个,即一次性查询。我应该将它添加到 for 循环本身吗?再次感谢
    • 这是 5 个查询对象,但实际上只发送到服务器:最后一个有五个 whereEqualTo 子句。
    猜你喜欢
    • 2020-07-14
    • 1970-01-01
    • 2020-12-22
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2021-09-01
    • 2019-02-06
    相关资源
    最近更新 更多