【问题标题】:Flutter Firebase ArrayContains Query in For LoopFlutter Firebase ArrayContains For 循环中的查询
【发布时间】:2023-04-11 09:22:01
【问题描述】:
String squery;

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

使用此代码,我可以显示包含 squery 变量的列表。

如果我以这种方式在 for 循环中使用此代码;

List<String> item = ["motor", "car", "plane"];

var sRef;

for (int i = 0; i < item.length; i++) {
      sRef = _firestore
          .collection("vehicles1")
          .where("models", arrayContains: item[i]);
    }

我可以显示包含项目列表中元素的列表。但我在这里面临一个问题。当我想使用 for 循环显示包含项目列表中元素的列表时,代码还会向我显示包含项目列表中最后一个元素的列表。

例如,在此示例中,它向我显示了包含电机、汽车和飞机的列表,它还显示了仅包含飞机的列表,但我不想仅显示包含飞机的列表,我只想显示包含电机、汽车、飞机的列表。

所以我只想在我的 Firebase 文档中显示所有文档列表。

这些是我的 Firebase 文档。

Motor Doc

Car Doc

Plane Doc

All Doc

当我使用上面编写的 for 循环运行代码时,我会得到这样的输出,但我只想得到名为 ALL 的列表。

My Output

为什么我得到名为 PLANE 的列表和名为 ALL 的列表。我只想列出名为 ALL 的列表。

【问题讨论】:

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


    【解决方案1】:

    for 循环的每次迭代中,您都将覆盖sRef 变量,并检查models 数组是否包含item 列表的一个特定元素。因此,在最后一次迭代中,您将检索包含plane 项的数组,即PLANEALL

    您正在尝试的是类似array-contains-all 的操作,目前不支持该操作。您可以查看this other post 了解有关此主题的更多信息。

    【讨论】:

    • 这个问题是针对flutter firebase的,我觉得是一个很大的缺点。虽然有 array contains 和 array contains any 之类的功能,但应该绝对使用 array contains all,顺便感谢您的回答。
    • 那么,您是否认为有办法以某种方式修复平面部分,这是这个 for 循环的最后阶段?
    • 一种选择是将models 数据存储为map 结构而不是array,即{motor: true, plane: true, car: true},这样您就可以像这样过滤:_firestore.collection("vehicles1").whereField("models.plane", isEqualTo: true).whereField("models.car", isEqualTo: true).whereField("models.motor", isEqualTo: true)跨度>
    • 好吧,我可以在 for 循环中做这个查询吗,因为我会查询列表中的元素,它们的元素和数量是可变的。
    • 我认为没有一个简单的方法可以通过它。一种选择可能是遍历vehicles1 中的所有文档,从每个文档中检索models 数组并在firestore 外部检查该数组是否包含您想要的所有元素(item 数组中的所有元素,在这个案例)。如果是,则检索该文档,如果不是,则继续下一个文档。
    猜你喜欢
    • 2021-09-26
    • 2021-09-11
    • 2020-09-13
    • 2023-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多