【问题标题】:FIRESTORE : Query Stream With Multiple where clauseFIRESTORE :具有多个 where 子句的查询流
【发布时间】:2021-02-03 14:50:24
【问题描述】:

希望你一切都好。

在这里,我在我的应用程序中创建了一个过滤器系统,我有一个 List filters 在其上应用 forEach 迭代,并且此迭代的每个 String 过滤器都添加到 Where 子句中,该子句检索所有其部分字段对应于我的 Firestore 查询的字符串过滤器之一的文档。

这是我尝试做的:

Stream<List<Article>> filteredArticles() async* {
    List<String> filters = ['Sport', 'Santé'];
    final articlesCollection = FirebaseFirestore.instance.collection('REVIEWS');
    Stream<List<Article>> filteredArticles;
    Stream<QuerySnapshot> queryStream;

    await Future.forEach(filters, (filter) async {
      queryStream = articlesCollection
          .where('section', isEqualTo: filter)
          .orderBy('createdDate', descending: true)
          .snapshots();

      filteredArticles = queryStream.map(_convertToArticleList);
    });

    yield* filteredArticles;
  }

将QuerySnapshot映射到文章列表的方法

List<Article> _convertToArticleList(QuerySnapshot snapshot) {
    return snapshot.docs.map((doc) {
      return Article.fromMap(doc.data());
    }).toList();
  }

将firestore文档数据转换为Article类的方法

factory Article.fromMap(Map<String, dynamic> data) {
    final id = data[Fields.id];
    final imagesLinks = data[Fields.imagesLinks];
    final createdDate = data[Fields.createdDate];
    final date = data[Fields.date];
    final title = data[Fields.title];
    final details = data[Fields.details];
    final section = data[Fields.section];
    final link = data[Fields.link];
    final likes = data[Fields.likes];
    return Article(
      id: id,
      imagesLinks: imagesLinks,
      createdDate: createdDate,
      details: details,
      date: date,
      title: title,
      section: section,
      link: link,
      likes: likes,
    );
  }

这是我的数据库,它目前包含 3 个文档,其中 2 个具有对应于其中一个过滤器(Sport、Santé)的 section 字段。

问题是我只收到一个文档而不是 2 个,这取决于过滤器在表格中的位置,即如果我将 Health 放在表格的第一个位置,我只会收到带有 section 字段的文档如果我将 Sport 放在表格的第一个位置,则对应于 Health 并且相同,我只收到与 Sport 对应的 section 字段的文档,而不是同时收到 2 个。

我的目标是检索其部分字段对应于我的列表中的字符串过滤器之一的所有文档。

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore stream


    【解决方案1】:

    要检查字段的值是否等于任何所需的值集,您可以使用基于数组成员的过滤:Source(查看数组查询部分)

    在您的 Firestore 查询中使用过滤器列表 filters,如下所示:

    queryStream = articlesCollection
              .where('section', arrayContainsAny: filters)
              .orderBy('createdDate', descending: true)
              .snapshots();
    

    【讨论】:

    • 通过这样做:queryStream = articlesCollection.where(Fields.section, arrayContainsAny: filters).orderBy(Fields.createdDate, descending: true).snapshots(); 我没有得到数据。
    • 但是section字段中有匹配项
    • 等一下,我的section字段不是数组,可以吗?
    • 您的部分字段不是数组。您正在检查 'section' 的值是否等于所需值列表中的任何元素。
    • 另外,请将答案标记为已接受,因为我看到您采用了相同的答案。谢谢
    【解决方案2】:

    经过大量研究,我设法通过阅读 FlutterFire 文档找到了解决方案。 这是我所做的: 我将字段部分的类型从 String 更改为 List&lt;String&gt;,其中仅包含一个元素,即我的关键字(我的过滤器)。

    然后为了过滤我的结果,我使用参数 arrayContainsAny 传递我的 List&lt;String&gt; filters 的 Firestore 的 where 方法

    Stream<List<Article>> filteredArticles;
    Stream<QuerySnapshot> queryStream;
    List<String> filters = ['Sport', 'Health'];
    
      queryStream = articlesCollection
          .where(Fields.section, arrayContainsAny: filters)
          .orderBy(Fields.createdDate, descending: true)
          .snapshots();
    
      filteredArticles = queryStream.map(_convertToArticleList);
    

    我希望这能帮助那些和我有同样问题的人。谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 2018-12-12
      • 2012-03-16
      • 1970-01-01
      • 2019-04-05
      相关资源
      最近更新 更多