【问题标题】:Join with object from a collection array result加入集合数组结果中的对象
【发布时间】:2018-10-14 02:52:43
【问题描述】:

我有 2 个收藏:

用户:uid、displayName。

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

我得到这样的活动:

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 };
          }))
    })
  }));

但它返回给我一个

 Observable<Observable<Activity>[]>>

【问题讨论】:

    标签: angular firebase google-cloud-firestore angularfire2


    【解决方案1】:

    您需要应用 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 };
              }))
        })
      }));
    

    【讨论】:

      【解决方案2】:

      @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))
      );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-19
        • 1970-01-01
        • 1970-01-01
        • 2016-04-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多