首页 > 解决方案 > 从 firestore 获取 ID 数组以从具有相同 ID 的另一个集合中获取文档,并将其结果组合到 Observable 中?

问题描述

我正在尝试做的事情

我有一个客户列表,每个客户都有一个发票 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 数组或 Observable[]> 的 Observable。

我想要的结果

我想要的结果是,获取 ID 数组,作为 snapshotChanges,将它们映射到获取 ID,从属于这些 ID 的“发票”集合中获取文档,这样我就可以使用 *ngFor="let invoice of (invoice$ | 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) 而不是订阅。

标签: angulartypescriptfirebaserxjsgoogle-cloud-firestore

解决方案


推荐阅读