Angular 从firestore获取ID数组,以从具有相同ID的另一个集合获取文档,并将其结果合并为可观察的<;型号[]>;?

Angular 从firestore获取ID数组,以从具有相同ID的另一个集合获取文档,并将其结果合并为可观察的<;型号[]>;?,angular,typescript,firebase,rxjs,google-cloud-firestore,Angular,Typescript,Firebase,Rxjs,Google Cloud Firestore,我想做的事 我有一个客户列表,每个客户都有一个发票ID列表,我将发票ID存储为单独的文档(仅包含订单的时间戳,而文档ID与发票ID相同)。我想做的是,将这些发票ID作为一个数组,然后从发票集合中获取实际发票,通过ID,将它们的结果组合成一个可观察的结果。到目前为止,我只能设法获得可观察性[]> 我尝试的 this.invoice$ = this.fs.collection('data').doc('admin').collection('customers').doc(this.customer

我想做的事

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

我尝试的

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
  })
)))));
正如我所说的,这会产生一个可观测的阵列或可观测[]>

我想要的结果

我想要的结果是,获取ID数组,作为快照更改,将它们映射到获取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">


这给了我想要的结果,但就像我说的,感觉像是一个混乱的解决方案。试图通过制作一个可观察的来解决这个问题,我可以在HTML上使用(可观察的|异步),而不是订阅。

你能告诉我你是否能找到解决方案吗?我现在面临着一个类似的问题。我通过在发票中存储customerId而不是在customer中存储InvoiceID来解决这个问题,然后通过customerId查询发票,所以这并不是问题本身的解决方案,只是改变了我的代码工作方式。谢谢你的回复!