加入集合数组结果中的对象

Join with object from a collection array result

我有 2 个合集:

用户:uid、displayName。

活动:用户可以创建的文档。它还包含 userUid 及其对用户集合的引用

我得到这样的活动:

this.activities = this.afs.collection<Activity>('activities')
 .snapshotChanges()
 .pipe(
   map((actions) => {
    return actions.map((a) => {
      const data = a.payload.doc.data();
      data.uid = a.payload.doc.id;
      return data;
    })
  }));

那么,我的问题是如何加入并获取用户数据的最佳方式是什么?

我这样试过:

actReference.snapshotChanges().pipe(
  map((actions) => {
    return actions.map((a) => {
      const actData = a.payload.doc.data();
      actData.uid = a.payload.doc.id;

      return this.userService.getUserDocById(actData.userUid).snapshotChanges()
        .pipe(
          map((userActions) => {
            const userData = userActions.payload.data();
            return { user: { uid: userData.uid, displayName: userData.displayName }, ...actData };
          }))
    })
  }));

但它 returns 我

 Observable<Observable<Activity>[]>>

您需要应用 rxjs 管道运算符链接。

actReference.snapshotChanges().pipe(
  map((actions) => {
    actions.map((a) => ({
      let actData = a.payload.doc.data();
      actData.uid = a.payload.doc.id;
      actData.displayName = a.payload.doc.name;
      return actData;
    });
  }),
  map((userData) => {
      return this.userService.getUserDocById(actData.userUid).snapshotChanges()
        .pipe(
          map((userActions) => {
            const userData = userActions.payload.data();
            return { user: { uid: userData.uid, displayName: userData.displayName }, ...actData };
          }))
    })
  }));

@suresh-kumar-ariya 的答案不是我的最终结果,但对我帮助很大,我最终得到了这段代码:

 return actReference.snapshotChanges().pipe(
  map((actions) => {
    return actions.map((a) => {
      const actData = a.payload.doc.data();
      actData.uid = a.payload.doc.id;

      return this.userService.getUserDocById(actData.userUid).snapshotChanges()
        .pipe(
          map((userActions) => {
            const userData = userActions.payload.data();
            return { user: { uid: userData.uid, displayName: userData.displayName }, ...actData } as Activity;
          }))
    })
  }),
  mergeMap(obs => combineLatest(obs))
);