使用运算符一次(内部联接)使用第一个查询的参数执行两个 firebase 查询?
Posted
技术标签:
【中文标题】使用运算符一次(内部联接)使用第一个查询的参数执行两个 firebase 查询?【英文标题】:Performing two firebase queries with argument from first query at once (inner join) using operators? 【发布时间】:2020-03-24 09:21:57 【问题描述】:使用此功能选择文档即时消息:
reservations: observable<any>;
/// ...
this.reservations = this.afs.collection('reservations', ref => ref.where('uid', '==', 'someUID'))
.snapshotChanges()
.pipe(
map(reservationData =>
return reservationData.map(reservation =>
const data = reservation.payload.doc.data();
const id = reservation.payload.doc.id;
console.log(data);
return id, ...data ;
);
)
);
我得到的结果:
[
"serviceid": "TM2Y6vBk70rgKZ3zTUAw",
"uid": "MwdM8bak78eE1omf6u04KtqlE2X2",
"venueid": "9G0miVLclY7QBZcHAMuq"
,
"serviceid": "dReNKvOyV1rOussdSdNe",
"uid": "MwdM8bak78eE1omf6u04KtqlE2X2",
"venueid": "2l3NhWeTC2HfB6nJmo5X"
]
如何向这个 obervable 添加另一个查询?它应该像 sql 中的内部连接一样工作,我需要从服务集合中添加文档(从接收到的 serviceid)。这个函数应该返回:
[
"rOussk78eE1oMwdM8ba": [
"name": "some name",
"price": 142
],
"uid": "MwdM8bak78eE1omf6u04KtqlE2X2",
"venueid": "9G0miVLclY7QBZcHAMuq"
,
"dReNKvOyV1rOussdSdNe": [
"name": "some name",
"price": 142
],
"uid": "MwdM8bak78eE1omf6u04KtqlE2X2",
"venueid": "2l3NhWeTC2HfB6nJmo5X"
]
我该怎么做?
Thanks in advance,
D.
【问题讨论】:
【参考方案1】:this.reservations = this.afs
.collection('reservations', ref => ref.where('uid', '==', 'someUID'))
.snapshotChanges()
.pipe(
map(reservationData =>
reservationData.map(reservation => (
id: reservation.payload.doc.id,
data: reservation.payload.doc.data()
))
),
switchMap(reservationArr => from(reservationArr)), // reduce the mapped array to single observables
switchMap(reservation =>
this.afs
.collection(`services`, ref => ref.where('serviceID', '==', reservation.id))
.valueChanges()
.pipe(
map(serviceData =>
const data = ;
data[reservation.id] = serviceData;
return data, ...reservation ;
)
)
)
);
您可以在获取数据后添加switchMap
以切换到第二个查询,然后添加pipe
> map
可观察到的可使用原始reservationData
(称为reservation
)和您的第二个查询的serviceData
。
【讨论】:
感谢马特,它看起来不错! switchMap 做的工作,但我有错误:属性 'id' 不存在类型 ' id: string;数据: ; []'。 我在中间添加了一个 switchMap 更新了我的答案,我没有考虑预订数组。您可以使用switchMap
=> from(arr)
组合将可观察对象数组转换为单个可观察对象。我认为这应该可以解决该错误。以上是关于使用运算符一次(内部联接)使用第一个查询的参数执行两个 firebase 查询?的主要内容,如果未能解决你的问题,请参考以下文章