Оплачиваемое чтение с snapshotChanges () - PullRequest
0 голосов
/ 25 сентября 2018

Я использую Cloud Firestore, и когда я добавляю документ в одну из своих корневых коллекций и регистрирую результат snapshotChanges() в этой коллекции, журнал показывает каждый документ в этой коллекции.

Я понимаю, что плата за Firebase основана на возвращенных документах, например, в запросе.

Вызывает ли snapshotChanges() также оплачиваемое чтение для каждого документа?

firebase.service.ts

@Injectable()
export class FirebaseService {

  public recordsCollection: AngularFirestoreCollection<any[]>;
  public records$: Observable<any[]>;

  public financialsCollection: AngularFirestoreCollection<any[]>;
  public financials$: Observable<any[]>;

  constructor(private db: AngularFirestore) {

    this.recordsCollection = this.db.collection<any[]>('records');
    this.records$ = this.mapAndReplayCollection(this.recordsCollection);

    this.financialsCollection = this.db.collection<any[]>('financials');
    this.financials$ = this.mapAndReplayCollection(this.financialsCollection);

  }

  private mapAndReplayCollection(collection: AngularFirestoreCollection<any[]>): any { 
   return collection.snapshotChanges()
      .pipe(
        map(changes => {
          return changes.map(a => {
           console.log(`${collection.ref.id} snapshotChanges: ${a.payload.doc.id}`);
           return { realId: a.payload.doc.id, ...a.payload.doc.data() }
          })
        }),
       shareReplay(1),
    );
  }

}

1 Ответ

0 голосов
/ 27 сентября 2018

Думайте, что ваш подход правильный, все выбросы поступают из вашего постоянного экземпляра сбора (наблюдаемого в горячем состоянии).но я предлагаю просто расширить цепочку сбора финансовых данных, чтобы создать поток financial$ и financialsWithReplay$, чтобы он выглядел более явным, а не оборачивал их в функцию (и, возможно, поэтому вы не уверены, что он кэшировал последний результат)

this.financials$ = this.financialsCollection.snapshotChanges()
  .pipe(
    map(changes => {
      return changes.map(a => {
       console.log(`${collection.ref.id} snapshotChanges: ${a.payload.doc.id}`);
       return { realId: a.payload.doc.id, ...a.payload.doc.data() }
      })
    })
);

this.financialsWithReplay$=this.financials$.pipe(shareReplay(1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...