【问题标题】:multiple where query in firestore queryBuilderfirestore queryBuilder中的多个where查询
【发布时间】:2020-08-01 23:37:34
【问题描述】:

我今天刚刚注意到,每当我想查询数据库时,我都会收到一个对我来说没有意义的错误,并且查询会停止工作。几周前它工作得很好。

无效的查询。所有带有不等式的过滤器(小于, lessThanOrEqual、greaterThan 或 greaterThanOrEqual) 必须在 同一个领域。但是您在“value1”和“value2”上有不等式过滤器)

  Stream<List<MyModel>> myStream(
      {MyFilter filter, String category}) {
    return _service.collectionsStream(
        path: APIPath.tools(cid, category),
        queryBuilder: filter != null
            ? (query) => query
                .where('value1', isGreaterThan: filter.minValue1)
                .where('value1', isLessThan: filter.maxValue1)
                .where('value2', isLessThan: filter.maxValue2)
                .where('value2', isGreaterThan: filter.minValue2)
            : null,
        builder: (data, documentID) => MyModel.fromMap(data, documentID),
        sort: (lhs, rhs) => lhs.value1.compareTo(rhs.value1));
  }

我做错了吗?这个错误是什么意思,为什么我上次没有得到它?

【问题讨论】:

    标签: flutter dart google-cloud-firestore


    【解决方案1】:

    使用 firebase,您无法对文档的多个字段进行查询。 因此,在您的情况下,您无法对“value1”和“value2”进行查询,您必须对“value1”进行查询,然后在您的查询中过滤以匹配“value2”。

    例子:

    //your query code 
    queryBuilder: filter != null
                ? (query) => query             
                    .where('value2', isGreaterThan: filter.minValue2)
                    .where('value2', isLessThan: filter.maxValue2)
                    ...
                : null,
    //your query code
    
    myQuery = querySnapshot.documents.where((document) => document.data['value1'] > filter.minValue1).toList();
    

    【讨论】:

      【解决方案2】:

      Firestore 查询只能在单个字段中包含关系条件(&gt;&lt; 等)。来自query limitations 上的文档:

      不支持在不同字段上使用范围过滤器的查询。

      因此,您必须选择希望 Firestore 在哪个字段上执行范围过滤。然后,您必须在应用程序代码中执行其他操作。

      要详细了解此限制存在的原因,以及如何在 Firestore 的限制范围内实施用例,我强烈建议您观看视频系列 Getting to know Cloud Firestore

      【讨论】:

      • 哇...我希望在我为我的应用程序选择 Firestore 之前知道这一点。即使我不得不花一周的时间写它,是否有机会让它发挥作用?我的意思是查询数据是我的应用程序的主要原因,所以没有它我可以使用不同的数据库重新开始
      • 您的任何努力都无法改变此 API 的功能,因此您必须学习如何使用它。要始终牢记的一件事是,Firestore 具有独特的硬性能保证,并且它只允许能够维持该保证的操作。这就是为什么它不允许您可能能够在其他数据库上执行的许多查询类型:
      • 如前所述,Firestore 的主要重点在于其独特的性能保证。如果查询功能对您的用例而言比那些性能保证更重要,您可能需要考虑另一种解决方案。
      • 您是否查询大量数据?如果是,您必须使用另一个数据库或使用像 algolia (firebase.google.com/docs/firestore/solutions/search) 这样的解决方案。如果没有,您可以下载整个集合并在实习生中进行过滤工作。我没有重新更新我的代码,因为如果您要处理大量数据,我的解决方案不是一个好习惯。
      • 我没用过Algolia,但是algolia不只是用于全文搜索,Algolia是一个提供复杂查询的工具。
      猜你喜欢
      • 2019-04-05
      • 1970-01-01
      • 1970-01-01
      • 2021-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      • 2014-12-13
      相关资源
      最近更新 更多