【问题标题】:AngularFireStore return collection with subquery带有子查询的 AngularFireStore 返回集合
【发布时间】:2019-03-05 22:09:05
【问题描述】:

我有以下功能

getParticipations(
    meetingId: string
  ): Observable<Participation[]> {
    return this.meetingCollection
      .doc(meetingId)
      .collection<ParticipationDto>('participations')
      .snapshotChanges()
      .pipe(
        map(actions =>
          actions.map(m => {
            const participationDto = m.payload.doc.data() as ParticipationDto;
            const id = m.payload.doc.id;
            return new Participation(id, participationDto.vart, null);
          })
        )
      );
  }

participationDto 中有一个文档引用,我想获取该文档,以便返回一个对象(参与)与引用文档的映射。

类似

  getParticipations(
    meetingId: string
  ): Observable<Participation[]> {
    return this.meetingCollection
      .doc(meetingId)
      .collection<ParticipationDto>('participations')
      .snapshotChanges()
      .pipe(
        map(actions =>
          actions.map(m => {
            const participationDto = m.payload.doc.data() as ParticipationDto;
            const id = m.payload.doc.id;
            return this.participantCollection.doc(participationDto.participant.id).get().pipe(
              map(pp => {
                return new Participation(id, participationDto.vart, pp.data() as Participant);
              })
            );
          })
        )
      );
  }

然后它返回一个Observable&lt;Observable&lt;Participation&gt;[]&gt; 我可能需要合并、映射或类似的东西,但我找不到正确的方法来丰富我的 Observable 与我的对象映射并保留我的 Observable&lt;Participation[]&gt;

感谢您的帮助

【问题讨论】:

  • 你可以尝试使用 flatMap 代替地图(内部地图)。
  • @ShubhamChaudhary 当我用 flatMap(pp => .. 替换 map(pp => .. 然后我得到一个 Observable[]> ...
  • 我想保留数组,但删除 observables 的两个“层”...... TT

标签: angular typescript google-cloud-firestore angularfire2


【解决方案1】:

您可以尝试在 Observables 的内部列表上使用 forkJoin 并将外部映射切换到 switchMap。

     getParticipations(
    meetingId: string
  ): Observable<Participation[]> {
    return this.meetingCollection
      .doc(meetingId)
      .collection<ParticipationDto>('participations')
      .snapshotChanges()
      .pipe(
        switchMap(actions =>
          forkJoin(actions.map(m => {
            const participationDto = m.payload.doc.data() as ParticipationDto;
            const id = m.payload.doc.id;
            return this.participantCollection.doc(participationDto.participant.id).get().pipe(
              map(pp => {
                return new Participation(id, participationDto.vart, pp.data() as Participant);
              })
            ));
          })
        )
      );
  }

【讨论】:

    【解决方案2】:

    您需要使用mergeMap 而不是map

    如下所示

    getParticipations(
        meetingId: string
      ): Observable<Participation[]> {
        return this.meetingCollection
          .doc(meetingId)
          .collection<ParticipationDto>('participations')
          .snapshotChanges()
          .pipe(
            mergeMap(actions =>
              actions.map(m => {
                const participationDto = m.payload.doc.data() as ParticipationDto;
                const id = m.payload.doc.id;
                return this.participantCollection.doc(participationDto.participant.id).get().pipe(
                  map(pp => {
                    return new Participation(id, participationDto.vart, pp.data() as Participant);
                  })
                );
              })
            )
          );
      }
    
    
    getParticipations(
        meetingId: string
      ): Observable<Participation[]> {
        return this.meetingCollection
          .doc(meetingId)
          .collection<ParticipationDto>('participations')
          .snapshotChanges()
          .pipe(
            map(actions =>
              actions.map(m => {
                const participationDto = m.payload.doc.data() as ParticipationDto;
                const id = m.payload.doc.id;
                return this.participantCollection.doc(participationDto.participant.id).get().pipe(
                  mergeMap(pp => {
                    return new Participation(id, participationDto.vart, pp.data() as Participant);
                  })
                );
              })
            )
          );
      }
    

    (由于它复杂且嵌套,并且没有提供stackblitz,我无法验证解决方案,但是如果它不起作用,请告诉我删除此答案)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      • 1970-01-01
      • 2020-12-18
      • 2022-01-05
      相关资源
      最近更新 更多