过滤文档引用作为字段

Md.*_*lam 9 angularfire2 angular google-cloud-firestore

我有3个收藏:

  1. User => with some field
  2. 组织=>有一些字段
  3. UserOrg包含以下字段:
    • uid //用户ID
    • orgid // orgid
    • userDetails //用户doc的文档引用,如user/uid
    • orgDetails // org/uid等组织文档的文档引用

现在我需要获取用户详细信息的用户详细信息

我的代码是:

return this.dbCollectionService.userOrganizationCollection.snapshotChanges()
      .pipe(map(res => {
        return res.map(data => {
          var userData = data.payload.doc.data()
         let userDetails : any;
         if (userData.userDetails) {

this.angularFirestore.doc(userData.userDetails).valueChanges().subscribe(res => {
          userDetails = res;
          console.log(userDetails);
        });

      return { id, ...userDetails }

    }).filter( f => f.organizationId != undefined && f.organizationId == orgId)
  }));
Run Code Online (Sandbox Code Playgroud)

这能够正确地控制结果,但不能返回数据.

可以从数据引用获取数据花费时间并且返回语句执行得更早.

ibe*_*oun 0

return { id, ...userDetails }在 上订阅之前执行this.angularFirestore .doc(userData.userDetails).valueChanges()

订阅内的订阅不是一个好主意,您应该使用其他 pipable 运算符(例如 switchMap)来链接两个调用:

return this.dbCollectionService
.userOrganizationCollection.snapshotChanges()
.pipe(
   map(res => res.map(data => data.payload.doc.data())),
   map(userDatas => userDatas.filter(_ => _)),
   map(userDatas => userDatas.map(this.angularFirestore.doc(userData.userDetails).valueChanges()
                                    .pipe(map(userDetails => ({ id, ...userDetails }))))),
   switchMap(userDatas$ => combineLatest(userDatas$)),
   map(users => users.filter( f => f.organizationId != undefined && f.organizationId == orgId))
);
Run Code Online (Sandbox Code Playgroud)