繁体   English   中英

尝试使用 angularfire 以角度加入一对多的 firebase 文档

[英]Trying to join one-to-many firebase documents in angular using angularfire

我知道以前有人问过这个问题,但我无法从提供的典型答案中找出我的情况。 在我的应用程序中,我有一个名为目标的 firebase 集合和一个具有一对多关系的任务集合。 每个目标都有一个任务数组(用任务的 ID 填充),每个任务都有一个objectiveId。 我想加入这些,所以当我进行 snapshotChanges() 调用以获取所有目标时,我想返回一个包含嵌套任务对象的目标数组。

我有这段代码,我知道它不起作用,因为我无法在 observable 中返回一些东西,但我想知道在这种情况下我将如何使用 RxJS 运算符?

loadObjectives() {
 return this.objectivesCollection.snapshotChanges().pipe(
  map(actions => {
    return actions.map(_ => {
      const id = _.payload.doc.id;
      const data = _.payload.doc.data();
      const tasks = this.afs
        .collection<Task>("tasks", ref =>
          ref.where("objectiveId", "==", id)
        )
        .valueChanges().subscribe( tasks => {
          return new Objective(id, data.title, tasks);
        });
    });
  }),
  tap(objectives => {
    this._objectives.next(objectives);
  })
);}

它可以通过一些巧妙的 RxJS 代码来完成,但通过在组件之间传递 props 来连接数据通常更容易。 例如,首先阅读您的目标,然后将 ID 传递给孩子以运行另一个任务查询。

<objectives-list *ngFor="let obj of objectivesCollection | async">

   <tasks-list [objective]="obj">

但是为了回答您的问题,下面的代码将从目标开始,然后将每个结果映射到任务查询。 最终结果将是一个数组数组(任务集合)。

this.objectivesCollection.valueChanges({idField: 'id'}).pipe(
  switchMap(objectives => {

     // map each objective to a task query

      const joins = objectives.map(obj => this.afs
          .collection<Task>("tasks", ref => ref.where("objectiveId", "==", obj.id))
          .valueChanges()
         )

      // execute all queries concurrently with combineLatest. 
      return combineLatest(joins)

   })
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM