将多个 Firestore 数据库集合调用结果组合到一个数组中

问题描述

在成功获取我用于后续 db 调用的子集合的所有引用后,我尝试将结果合并到单个 Observable 数组中。

现在,每次解析课程引用和使用 loadAllLessons() 进行数据库查询时,snapshotChanges() 函数订阅内的值都会更新为单个数组。

Firestore 数据库中的目标子集合(课程)嵌套在集合(课程)中。我的代码看起来很像这样:

 getAllLessonsRef(): Observable<string[]> {
    return this.db.collection('/courses')
      .snapshotChanges()

      .pipe(map(snap => snap.map(s => {
        const courseId = s.payload.doc.id;

        const lessonRef = `/courses/${courseId}/lessons`;

        return lessonRef

      })));

  }

  loadAllLessons(): Observable<any> {
    
    return this.getAllLessonsRef()
    
      .pipe(switchMap(lessonRefs => {

        let items =
          lessonRefs.map(ref => {
            console.log(ref)
            return this.db.collection(`${ref}`).snapshotChanges()
          });

         return merge(...items)
      }),map(list => {
        return convertSnaps<Lesson>(list)
      }))
  }

合并所有后续结果的最佳方法是什么?

解决方法

我可能会为此使用 forkJoin。详细了解 forkJoin here

  import { forkJoin } from 'rxjs';
....
  loadAllLessons(): Observable<any> {
    
    return this.getAllLessonsRef()
    
      .pipe(switchMap(lessonRefs => {
        return forkJoin(...lessonRefs.map(ref => this.db.collection(`${ref)`).snapshotChanges()));
      }),map(list => {
        return convertSnaps<Lesson>(list)
      }))
  }
,

我使用旧代码找到的解决方案是在订阅方法中加入结果

    this.lessonService.loadAllLessons()
      .subscribe(
          lessons => {
            lessons.map(lesson => {
                this.allLessons.push(lesson)
            })
          }
        )