如何在 Flutter 项目中合并两个 firestore 查询以及如何从这两个流中删除重复文档?
How to merge two firestore queries in the Flutter project and How do I remove the duplicate documents from these two streams?
我需要在我的 flutter 项目中合并两个 firestore 查询流。我该怎么做呢?
我尝试了 StreamZip([Stream1, stream2]) 方法来组合流,它对我有用。
但流可能包含相同的文档。所以当我列出它们时,所有文件都被列出,即使有副本。如何从这两个流中删除重复文档?
Stream<List<QuerySnapshot>> getData() {
Stream defaultStream1 = _firestore
.collection("Gyms")
.where("gymPlaceTags", arrayContainsAny: ["dubai"])
.orderBy('createdAt', descending: true)
.snapshots();
Stream defaultStream2 = _firestore
.collection("Gyms")
.where("gymFavTags", arrayContainsAny: ["ajman"])
.orderBy('createdAt', descending: true)
.snapshots();
return StreamZip([defaultStream1, defaultStream2]);
}
您需要执行几个步骤:
map
流到 return 另一个 List<DocumentSnapshot>
而不是 List<QuerySnapshot>
- 在
map
函数中,使用List上的fold
去重映射到List<DocumentSnapshot>
在fold
函数中,遍历QuerySnapshot
中的每一个文档,在添加之前检查是否已经存在具有相同id的文档。
Stream<List<DocumentSnapshot>> merge(Stream<List<QuerySnapshot>> streamFromStreamZip) {
return streamFromStreamZip.map((List<QuerySnapshot> list) {
return list.fold([], (distinctList, snapshot) {
snapshot.documents.forEach((DocumentSnapshot doc) {
final newDocument = distinctList.firstWhere(
(DocumentSnapshot listed) =>
listed.documentId == doc.documentId,
orElse: () => null) == null;
if (newDocument) {
distinctList.add(doc);
}
});
return distinctList;
});
});
}
注意:我没有运行这段代码,但应该是这样的。
我认为使用串行 where 子句更好。
Stream stream = FirebaseFirestore.instance.collection("Gyms").where('gymPlaceTags', arrayContainsAny: ["dubai"]).where("gymFavTags", arrayContainsAny: ["ajman"]).orderBy('createdAt', descending: true).snapshots();
这种类型的查询对我有用。希望这能解决您的问题。
我需要在我的 flutter 项目中合并两个 firestore 查询流。我该怎么做呢? 我尝试了 StreamZip([Stream1, stream2]) 方法来组合流,它对我有用。 但流可能包含相同的文档。所以当我列出它们时,所有文件都被列出,即使有副本。如何从这两个流中删除重复文档?
Stream<List<QuerySnapshot>> getData() {
Stream defaultStream1 = _firestore
.collection("Gyms")
.where("gymPlaceTags", arrayContainsAny: ["dubai"])
.orderBy('createdAt', descending: true)
.snapshots();
Stream defaultStream2 = _firestore
.collection("Gyms")
.where("gymFavTags", arrayContainsAny: ["ajman"])
.orderBy('createdAt', descending: true)
.snapshots();
return StreamZip([defaultStream1, defaultStream2]);
}
您需要执行几个步骤:
map
流到 return 另一个List<DocumentSnapshot>
而不是List<QuerySnapshot>
- 在
map
函数中,使用List上的fold
去重映射到List<DocumentSnapshot>
在
fold
函数中,遍历QuerySnapshot
中的每一个文档,在添加之前检查是否已经存在具有相同id的文档。Stream<List<DocumentSnapshot>> merge(Stream<List<QuerySnapshot>> streamFromStreamZip) { return streamFromStreamZip.map((List<QuerySnapshot> list) { return list.fold([], (distinctList, snapshot) { snapshot.documents.forEach((DocumentSnapshot doc) { final newDocument = distinctList.firstWhere( (DocumentSnapshot listed) => listed.documentId == doc.documentId, orElse: () => null) == null; if (newDocument) { distinctList.add(doc); } }); return distinctList; }); }); }
注意:我没有运行这段代码,但应该是这样的。
我认为使用串行 where 子句更好。
Stream stream = FirebaseFirestore.instance.collection("Gyms").where('gymPlaceTags', arrayContainsAny: ["dubai"]).where("gymFavTags", arrayContainsAny: ["ajman"]).orderBy('createdAt', descending: true).snapshots();
这种类型的查询对我有用。希望这能解决您的问题。