【问题标题】:Multiple Where Cases in a Flutter Stream Builder built from Firestore Collection从 Firestore 集合构建的 Flutter Stream Builder 中的多个 Where 案例
【发布时间】:2020-09-07 00:16:12
【问题描述】:

我在 Firestore Collection 返回的 Flutter Stream Builder 中找不到如何使用多个 where 子句的文档或示例。

下面的查询有效

      Firestore
          .instance
          .collection (collectionName)
          .where      ("index",   arrayContains:  search)
          .orderBy    ('date',    descending:     true  )
          .snapshots()

但如果我添加一个额外的 where 子句,则返回零

      Firestore
          .instance
          .collection (collectionName)
          .where      ("index",   arrayContains:  search)
          .where      ('allowed_roles', arrayContains: GlobalVars.userRole.toString() )
          .orderBy    ('date',    descending:     true  )
          .snapshots() 

Firebase 文档中的复合查询示例看起来与上面差不多,但缺少 Flutter 或 Dart 示例。

编辑: 我也尝试过查询构建模式作为解决方法,但它也不起作用。 Flutter 真的不希望arrayContains 子句不止一次。

  CollectionReference collectionRef = Firestore.instance.collection (collectionName);
  Query p =  collectionRef.where      ('allowed_roles', arrayContains: "3");
  Query q =  p.where      ('index', arrayContains: "Dan");

  Stream s = q.snapshots(); 

我在这里缺少的是程序员应该使用什么解决方案来解决这个问题,逻辑与是一个非常基本的等式,坚持这个功能是不寻常的。

【问题讨论】:

  • 您的代码似乎没有任何错误检查。你有错误吗?它说什么?究竟是什么不符合您的预期?
  • 没有错误,只要我使用两个 where 子句,它就会表现为一个空查询,并且只要您提供一个或其他 where 子句,它就会开始工作。所以很明显,查询不是排他的。这篇文章解释说,flutter 遵循“构建查询模式”stackoverflow.com/questions/50316462/… 但构建查询模式破坏了 Stream Builder,所以我仍在检查一个合法的源代码应该如何编写
  • 你确定没有错误吗?文档建议每个查询不能有多个包含数组的过滤器。
  • 不,我的日志中没有任何内容,应用程序的行为就像查询没有返回任何内容一样。它不会卡住它自己执行它而没有任何错误。所以你提到每个查询一个数组过滤器是有道理的。现在的问题是在这种情况下如何执行逻辑与
  • 我会指出你没有代码做实际的错误检查。我不希望所有内容都显示在日志中。并且文档表明您不能有两个包含数组的过滤器。 firebase.google.com/docs/firestore/query-data/…

标签: flutter dart google-cloud-firestore


【解决方案1】:

正如 cmets 中提到的,Firebase 不会使用多个 arrayContains 子句。

我的情况的唯一解决方案是在我的活动中为allow_roles 数组挂钩一个条件语句:

if( document['allowed_roles'].contains( GlobalVars.userRole ))

【讨论】:

    【解决方案2】:

    一个查询中不能有两个 arrayContains 过滤器:

          .where      ("index",   arrayContains:  search)
          .where      ('allowed_roles', arrayContains: GlobalVars.userRole.toString() )
    

    根据documentation,一次只支持一个arrayContains。这是 Firestore 的限制,无法更改。查询肯定会产生错误 - 您应该添加代码来检查错误,而不是盲目地假设它成功。

    【讨论】:

    • 这是一个完全不同的查询,根本不涉及数组。它有一个相等过滤器和一个范围过滤器,这是有效的。
    猜你喜欢
    • 2018-11-05
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 2020-11-23
    • 2019-08-11
    • 2019-09-12
    • 1970-01-01
    相关资源
    最近更新 更多