【问题标题】:Many to many relationships with AngularFire与 AngularFire 的多对多关系
【发布时间】:2021-07-27 03:29:11
【问题描述】:

我有一个概念问题。

我在 Firestore 中定义了多对多关系。我有 3 个集合,A、B 和 A_B。 A_B 集合具有 IdA_IdB {idA: idA, idB:idB}

的文档

我需要的是创建 B 的与 a 相关的文档并 Observable A的文件。

我不知道我需要使用哪个 rxjs 运算符或如何使用。我曾尝试使用 switchMap 或 forEach 和 MergeMap,但没有成功。

我的想法是首先使用 ref.where 和 pass (idA) 查询集合 A_B。然后 forEach 结果查询 B 集合通过 docRef.idB 并将结果合并到一个 Observable 中。

谢谢!

【问题讨论】:

    标签: rxjs angularfire


    【解决方案1】:

    基本上,对于特定的文档 A,docA 你想要:

    • 查询A_B collection where IdA = docA.Id(我们称结果为“关系”)
    • 对于每个关系,查询 DocumentB 集合 where Id = relation.IdB
    • 使用relatedBs 属性返回docA (DocumentB[])

    要使用 rxjs 完成此操作,您可以使用 switchMapcombineLatestmap

    AngularFire 语法在我的脑海中并不新鲜,但类似这样的伪代码应该可以工作:

    1  public documentA$ = this.afStore.document(id).pipe(
    2    switchMap(docA => this.afStore.collection('A_B').where('idA', '=', docA.id).pipe(
    3      switchMap(relations => combineLatest(relations.map(r => this.afStore.document(r.idB)),
    4      map(relatedBs => ({...docA, relatedBs}))
         ))
       );
    

    下面是对流程的解释:

    1. 获取DocumentA
    2. switchMap #1 获取相关的A_B 记录
    3. switchMap #2 获取相关的DocumentB 文档的集合,方法是使用combineLatest 创建一个可观察对象,该可观察对象通过将每个关系映射到获取相应DocumentB 的可观察对象来发出集合
    4. map 只是返回原始的 DocumentA 并附加一个 relatedBs 属性

    【讨论】:

      猜你喜欢
      • 2011-06-02
      • 1970-01-01
      • 2018-03-16
      • 2017-08-25
      • 2017-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多