我希望你一切都好。
在这里,我在应用程序中创建了一个过滤器系统,我有一个列表过滤器,在其上应用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é)。问题是我只收到一个文档,而不是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/