无订阅的Firebase加入

时间:2018-08-06 11:25:35

标签: angular firebase google-cloud-firestore

我需要在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);
    });
  }

0 个答案:

没有答案