如何在 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]);
  }

您需要执行几个步骤:

  1. map 流到 return 另一个 List<DocumentSnapshot> 而不是 List<QuerySnapshot>
  2. map函数中,使用List上的fold去重映射到List<DocumentSnapshot>
  3. 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();

这种类型的查询对我有用。希望这能解决您的问题。