我需要在Firebase Firestore DB中联接两个表。这样做,我必须从集合“参与者”中获取一个值,然后执行forEach
来恢复集合“事件”中的事件数据,将其推入数组,然后以promise返回该数组。 / p>
我正在使用.valueChanges().subscribe()
。这里发生的是,如果我为该与会者添加一个新事件,则订阅有效,并将数据再次推送到数组中。
我需要知道的是联接表如何工作。有什么方法可以执行没有订阅的forEach?
谢谢!
编辑
这是我执行收藏的收藏组合
findByUserUid(user_uid: string) {
let events: any[] = [];
console.log(events);
return new Promise((resolve, reject) => {
console.log(events);
this.db
.collection('attendees', ref => ref.where('user_uid', '==', user_uid))
.snapshotChanges()
.subscribe((attendeesSnaps: any) => {
events = [];
attendeesSnaps.forEach((attendeeSnapshot: any) => {
this.db
.collection('events')
.doc(attendeeSnapshot.payload.doc.data().event_uid)
.valueChanges()
.subscribe((event: any) => {
console.log(events);
event.uid = attendeeSnapshot.payload.doc.data().event_uid;
events.push(event);
console.log('pushing', event);
});
});
});
console.log('all events', events);
resolve(events);
});
}
更新集合“与会者”时(向-this-事件添加新的与会者),foreach再次被执行,我在events
数组中得到了重复的数据(由于订阅而再次返回)。
我需要避免重复的数据在每次集合更新中返回。
编辑2
我已解决此问题。使用.ref.get()
很好!这是该方法的最终版本(如果可以改进,请告诉我:))
findByUserUid(user_uid: string) {
const events: any[] = [];
return new Promise((resolve, reject) => {
this.db
.collection('attendees')
.ref.where('user_uid', '==', user_uid)
.get()
.then((attendeesSnaps: any) => {
attendeesSnaps.forEach((attendeeSnapshot: any) => {
this.db
.collection('events')
.doc(attendeeSnapshot.data().event_uid)
.ref.get()
.then((eventSnap: any) => {
const event = eventSnap.data();
event.uid = eventSnap.id;
events.push(event);
})
.catch(err => {
reject(err);
});
});
})
.catch(err => {
reject(err);
});
resolve(events);
});
}