Как объединить два запроса Firestore в проекте Flutter и Как удалить дубликаты документов из этих двух потоков? - PullRequest
0 голосов
/ 06 апреля 2020

Мне нужно было объединить два потока запросов пожарного магазина в моем проекте флаттера. Как мне это сделать? Я попробовал метод 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 Ответ

1 голос
/ 06 апреля 2020

Есть несколько шагов, которые вам нужно сделать:

  1. map поток, чтобы вернуть еще один List<DocumentSnapshot> вместо List<QuerySnapshot>
  2. В map используйте fold в списке, чтобы удалить дубликаты, и сопоставьте с List<DocumentSnapshot>
  3. В функции fold go для каждого документа в QuerySnapshot и проверьте, если документ с тем же идентификатором уже присутствует перед добавлением.

    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;
        });
      });
    }
    

    Примечание : я не запускал этот код, но он должен выглядеть примерно так.

...