我使用angularFirestore来查询firebase,我希望使用DocumentReference连接来自多个文档的数据.
管道中的第一个运算符映射返回一个IOrderModelTable数组,第二个运算符,即switchMap迭代数组,每个元素使用每个元素中包含的id来查询其他表中的数据.
问题是在swithMap中我得到了一个可观察的数组,因为有了一个anidated map运算符.我如何获取IOrderModelTable数组,然后返回此数组的observable.
代码是:
getDataTableOperatorsFromDB(): Observable<IOrderModelTable[]> {
const observable = this.tableOperatorsCollectionsRef.snapshotChanges().pipe(
map(actions => {
return actions.map(a => {
const data = a.payload.doc.data() as IOrdersModelDatabase;
const id = a.payload.doc.id;
data.ot = id;
return data;
});
}),
switchMap(data => {
const result = data.map(element => {
return this.afs.collection('Orders/').doc(element.orderNumberReference.id).valueChanges().pipe(map(order => {
return {
otNumber: element.ot,
clientName: '',
clientReference: order.clientReference,
id: element.orderNumberReference,
};
}));
});
// Result must be an IOrderModelTable[] but is a Observable<IOrderModelTable>[]
return of(result);
})
);
解决方法:
您可以使用to Array运算符将流转换为数组,但请确保您的流将结束.
诀窍是选择正确的流.
对于您的问题,自然来源将是您第一次通话时收到的列表.以示意图的方式,我可以把它,你得到一个id列表,你转换成一个增强信息列表:
第一次输入… snapshopChanges():
—-[A, B, C]——>
每个元素都通过… valueChanges()转换:
——-Call A ————-DataA——–>
——-Call B ————————DataB—–>
——-Call C ——————–DataC—–>
然后使用toArray()减少:
———————————————-[DataA, DataC, DataB]——–>
码:
getDataTableOperatorsFromDB(): Observable<IOrderModelTable[]> { {
return this.tableOperatorsCollectionsRef.snapshotChanges()
.pipe(
map(actions => {
from(data).pipe(
map(action => {
const data = a.payload.doc.data() as IOrdersModelDatabase;
const id = a.payload.doc.id;
data.ot = id;
return data;
}),
mergeMap(element => {
return this.afs.collection('Orders/').doc(element.orderNumberReference.id).valueChanges().pipe(
map(order => {
return {
otNumber: element.ot,
clientName: '',
clientReference: order.clientReference,
id: element.orderNumberReference,
};
})
);
}),
toArray()
);
})
)
}
重要提示:我用mergeMap替换了switchMap,否则可能会丢掉一些信息.