【问题标题】:Flutter Firebase ArrayContains Where QueryFlutter Firebase ArrayContains Where 查询
【发布时间】:2021-09-26 13:02:30
【问题描述】:
 var searchRef = _firestore
        .collection("vehicles")
        .where("models.plane", isEqualTo: "true")
        .where("models.bus", isEqualTo: "true");

在此查询方法中,我可以查询多个值,但我想动态地执行此操作。如果用户进入飞机,我想查询飞机或者如果用户进入飞机和公共汽车,我想查询飞机和公共汽车,或者如果用户进入飞机,公共汽车和跑车,我想查询飞机、公共汽车和跑车。即要查询的变量个数,变量会因用户而异。

如何将此代码转换为动态代码。

【问题讨论】:

    标签: firebase flutter for-loop google-cloud-firestore


    【解决方案1】:

    目前这是不可能的。您必须获取包含其中任何一个值的文档,然后在 Flutter 应用中手动过滤它们。

    您只需将该数组作为arrayContains 的值传递。

    var sRef = _firestore
               .collection("vehicles1")
               .where("models", arrayContains: item);
    

    此查询将返回 vehicles 集合中的所有文档,其中数组 models 包含您传递的数组中的任何一项。然后您可以过滤该数组并检查哪些文档的模型数组包含所有这些项目。

    你可以查看这个答案:Flutter filter list as per given condition

    【讨论】:

      【解决方案2】:

      您似乎想返回包含所有数组项的文档。

      所以我建议这样做。

      List<String> item = ["motor", "car", "plane"];
      
      var sRef = sRef = _firestore
                .collection("vehicles1");
      
      for (int i = 0; i < item.length; i++) {
            
                sref = sref.where("models", arrayContains: item[i]);
      }
      
      // finally
      
      print(sref.snapshotChanges()) //something like this
      
      

      基本上上面的代码会做的是 它将生成一个复杂的查询,例如

      _firestore.collection("vehicles").where("models", arrayContains: item[0]).where("models", arrayContains: item[1]).where("models", arrayContains: item[2]) //... and so on till for loop ends
      
      

      【讨论】:

      • 文档说,每个查询最多可以使用一个数组包含子句
      • 似乎是 firebase 功能的原生问题之一。好的,给我一些时间,如果您更改数据库架构,可能会有一些机会。让我想办法解决。
      • 你能告诉我上述方法的用例吗?就像我试图了解你真正想用你的架构实现什么。
      猜你喜欢
      • 2021-09-11
      • 2023-04-11
      • 2023-01-15
      • 2021-06-17
      • 2021-11-13
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 2021-03-25
      相关资源
      最近更新 更多