AngularFirestore中如何通过其他文档的ID获取目标文档数据?
解决AngularFirestore中关联集合数据的问题
看起来你已经成功获取到了diets文档里的commentsDiet数组,但现在需要把每个评论里的userId关联到users集合中的用户信息(displayName和photoUrl)对吧?这是Firebase中很常见的关联查询场景,我来帮你调整代码:
核心思路
因为每个评论的userId对应users集合里的一个文档,我们需要遍历评论数组,为每个ID发起用户文档查询,然后把用户数据合并到对应的评论对象中。这里可以用RxJS的forkJoin来并行处理多个用户查询,再通过switchMap把外层的diets文档流和内层的用户查询流结合起来。
修改后的代码
import { forkJoin } from 'rxjs'; import { switchMap, map } from 'rxjs/operators'; // ... 你的其他代码 this.commentsDiet = this.commentsDietC.snapshotChanges().pipe( switchMap(action => { const dietData = action.payload.data(); // 先判断是否存在commentsDiet数组 if (!dietData?.commentsDiet) { return []; // 没有评论的话返回空数组 } // 为每个评论创建用户文档查询的Observable const userObservables = dietData.commentsDiet.map(comment => { return db.doc<any>(`users/${comment.userId}`).valueChanges(); }); // 并行获取所有用户数据,然后和评论数组合并 return forkJoin(userObservables).pipe( map(usersData => { // 把用户数据合并到对应的评论里 return dietData.commentsDiet.map((comment, index) => { return { ...comment, displayName: usersData[index]?.displayName || '匿名用户', photoUrl: usersData[index]?.photoUrl || '' }; }); }) ); }) );
代码细节说明
- switchMap:用来切换Observable流,当diets文档发生变化时,自动重新发起用户查询,保证数据实时同步。
- forkJoin:等待所有用户文档的查询都完成后,把结果数组返回,并行处理比逐个查询效率更高。
- 可选链与默认值:用
usersData[index]?.displayName避免用户文档不存在时的报错,同时设置默认值提升体验。
内容的提问来源于stack exchange,提问作者Joan
相关产品推荐
相关产品推荐

