Angular Firebase无需订阅即可加入
我需要连接Firebase Firestore DB中的两个表。要执行此操作,我必须从集合“Attenders”获取一个值,然后执行Angular Firebase无需订阅即可加入,angular,firebase,google-cloud-firestore,Angular,Firebase,Google Cloud Firestore,我需要连接Firebase Firestore DB中的两个表。要执行此操作,我必须从集合“Attenders”获取一个值,然后执行forEach以恢复集合“event”中的事件数据,将其推送到数组中,然后以承诺的形式返回数组 我正在使用.valueChanges().subscribe()。这里发生的事情是,如果我为该与会者添加一个新事件,订阅将工作并再次将数据推送到阵列中 我需要知道的是,联接表是如何工作的。有没有办法在没有订阅的情况下执行forEach 谢谢 编辑 这是用于执行联接的集合组
forEach
以恢复集合“event”中的事件数据,将其推送到数组中,然后以承诺的形式返回数组
我正在使用.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);
});
}
更新集合“Attendes”(向-this-event添加新的与会者)时,foreach将再次执行,并且我在events
数组中获得了重复数据(由于订阅再次返回)
我需要避免在每次收集更新中返回重复数据
编辑2
我已经解决了这个问题。使用.ref.get()
效果很好!这是我的最终版本的方法(如果可以改进,请让我知道:)
Firestore中没有联接操作。是的,我知道,我正在合并两个集合的数据。也许,我问错了。
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);
});
}