firebase - FIRESTORE:具有多个where子句的查询流

标签 firebase flutter dart google-cloud-firestore stream

我希望你一切都好。
在这里,我在应用程序中创建了一个过滤器系统,我有一个列表过滤器,在其上应用forEach迭代,并且此迭代的每个String过滤器都添加到Where子句中,Where子句检索其section字段对应于其中一个字段的所有文档。我的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个文档的section字段对应于其中一个过滤器(Sport,Santé)。
first database image
second database image
问题是我只收到一个文档,而不是2,这取决于表格中过滤器的位置,即,如果将Health放在表格的第一位置,则我只会收到带有对应于Health的section字段的文档如果将“运动”放在表格的第一个位置,则同样的,我只会收到带有“运动”对应的“节”字段的文档,而不是同时收到2。
我的目标是检索其节字段与“列表”中的“字符串”过滤器之一相对应的所有文档。

最佳答案

要检查字段的值是否等于任何所需的值集,可以使用基于数组成员的过滤:Source(检查数组查询部分)
在Firestore查询中使用过滤器列表filters,如下所示:

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

关于firebase - FIRESTORE:具有多个where子句的查询流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64450866/

相关文章:

ios - Flutter 与 Firebase 在 IOS 上的集成错误(无法安装 pod)

firebase - 如何动态地将 map 数组添加到cloud firestore中?

webview - 如何使用flutter dart webview渲染本地HTML文件

sass - 如何在 Dart 编辑器中使用 SASS

flutter - -bash : flutter: command not found

firebase - 可编辑的同步排序顺序

firebase - 如何更新 firebase 数组中的 map 数据? ( flutter )

firebase - 无法在 docRef 函数中使用 this.$router.push (' ' )

android-studio - Flutter App不会显示内容,除非单击某些按钮

firebase - 如何更改firebase电话身份验证中的短信验证模板