Отображать повторяющиеся события после обновления данных firestore, но сами данные в firestore не дублируются - программирование
Подтвердить что ты не робот

Отображать повторяющиеся события после обновления данных firestore, но сами данные в firestore не дублируются

У меня есть веб-приложение (Angular) и мобильное приложение (Ionic). Обе они имеют одни и те же данные Firestore.

Используйте веб-приложение для обновления существующих данных, но в ионном приложении отображаются повторяющиеся элементы (дубликаты будут удалены после перезапуска мобильного приложения), я сам проверю данные элемента в Firestore, он был обновлен и уникален. Кто-нибудь знает об этом?

Эта проблема возникает только в мобильном приложении, отличном от веб-приложения, оба из них используют "angularfire2": "^5.0.0-rc.4",

   import { AngularFirestore, AngularFirestoreCollection } from 'angularfire2/firestore';

   this.posts$ = this.db.getRecentPosts().snapshotChanges().pipe(
      map(arr => arr.map(doc => {
          return { id: doc.payload.doc.id, ...doc.payload.doc.data() }
        }
      ))
    );

Были исследования и кажется (не на 100% уверен) проблема angularfire2: AngularFirestoreCollection иногда возвращает дубликат записей после вставки новой записи

enter image description here

4b9b3361

Ответ 1

Поскольку дубликаты исчезли после перезагрузки, а другие люди сообщают об этой проблеме, я чувствую, что проблема находится в пределах самого AngularFirestore. В качестве обходного пути вы можете попробовать следующее:

 import { AngularFirestore, AngularFirestoreCollection } from 'angularfire2/firestore';

   this.posts$ = this.db.getRecentPosts().snapshotChanges().pipe(
      map(arr => arr.reduce((acc, doc) => { // map -> reduce
        const id = doc.payload.doc.id
        // remove !(id in acc) to get last duplicate
        !(id in acc) && acc[id] = { id, ...doc.payload.doc.data() } 
        return acc }
        }, {} // reduce seed
      )),
      // you can also Object.values(arr.reduce(...)), but this I find bit more readable
      map(coll => Object.values(coll))
    );