带有子查询的 AngularFireStore return 集合
AngularFireStore return collection with subquery
我有以下功能
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
中有一个文档引用,我想获取该文档以便 return 一个对象(参与)与引用文档的映射。
类似
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);
})
);
})
)
);
}
但是 return 是 Observable<Observable<Participation>[]>
我可能需要合并、映射或类似的东西,但我没有找到使我的 Observable 丰富我的对象映射并保持我的 Observable<Participation[]>
的正确方法
感谢帮助
您可以尝试在 Observable 的内部列表上使用 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);
})
));
})
)
);
}
您需要使用 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
,所以我无法验证解决方案,但是如果它不起作用请告诉我删除此答案)
我有以下功能
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
中有一个文档引用,我想获取该文档以便 return 一个对象(参与)与引用文档的映射。
类似
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);
})
);
})
)
);
}
但是 return 是 Observable<Observable<Participation>[]>
我可能需要合并、映射或类似的东西,但我没有找到使我的 Observable 丰富我的对象映射并保持我的 Observable<Participation[]>
感谢帮助
您可以尝试在 Observable 的内部列表上使用 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);
})
));
})
)
);
}
您需要使用 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
,所以我无法验证解决方案,但是如果它不起作用请告诉我删除此答案)