从Firestore获取ID数组,以从另一个具有相同ID的集合中获取文档,并将其结果合并为Observable <model []>?

时间:2019-03-02 13:20:50

标签: angular typescript firebase rxjs google-cloud-firestore

我要做什么

我有一个客户列表,每个客户都有一个发票ID列表,我将发票ID存储为单独的文档(仅包含订单的时间戳记,而文档ID与invoiceID相同)。我想做的是,将这些发票ID作为数组获取,然后按ID从发票集合中获取实际发票,并将其结果合并为一个Observable。到目前为止,我只能设法获得Observable []>

我尝试过的事情

this.invoice$ = this.fs.collection('data').doc('admin').collection('customers').doc(this.customer.id)
.collection('invoiceIDs').snapshotChanges().pipe(
  map(idSnapshots => idSnapshots.map(id => this.fs.collection('data').doc('admin')
  .collection('invoices').doc(id.payload.doc.id).valueChanges().pipe(map(invoice => new InvoiceModel({
    id: id.payload.doc.id,
    ...invoice
  })
)))));

就像我说的那样,这会产生一个Observable of Observable数组或Observable []>。

我想要的结果

我想要的结果是,获取ID数组,作为snapshotChanges,将其映射为获取ID,从属于这些ID的“发票”集合中获取文档,以便我可以使用* ngFor =“让发票为(发票$ | async)”将每个发票显示为卡。

我当前的草率解决方案

现在,我可以通过订阅ID并将已订阅的ID分配给其他组件来实现类似的结果,这是一个麻烦的解决方案,如下所示:

this.subs.push(this.fs.collection('data').doc('admin').collection('customers').doc(this.customer.id)
.collection('invoiceIDs').snapshotChanges().pipe(map(ids => ids.map(id => id.payload.doc.id))).subscribe(ids => {
  this.invoiceIDs = ids;
  this.cdref.detectChanges();
}));

然后我使用* ngFor获取每个发票ID

<ng-container *ngFor="let invoice of invoiceIDs">

将每个ID分配给我称为的组件

<m-finance-frame [id]="invoice">

给出我想要的结果,但是就像我说的那样,感觉就像是一个混乱的解决方案。尝试通过使一个Observable(我可以在HTML上与(Observable | async)一起使用)来解决此问题,而不是订阅。

0 个答案:

没有答案