Javascript 基于firestore中的文档引用获取集合值

Javascript 基于firestore中的文档引用获取集合值,javascript,google-cloud-firestore,ionic4,angularfire2,Javascript,Google Cloud Firestore,Ionic4,Angularfire2,我正在使用angularfirebase开发Ionic5-angular应用程序,我在firestore数据库中有以下集合,其中partners是用户的文档引用数组。我想显示所有公寓列表以及合作伙伴的姓名(用户集合中的名字和姓氏)。当我使用一套公寓的ID进行查询并从其他集合中获取其他详细信息时,我能够编写查询以正确获取数据。然而,当我试图获得所有公寓的所有其他细节,如在本例中的用户,我挣扎 当我有公寓id时获取一个公寓详细信息的方法: getApartmentById(aptId: stri

我正在使用angularfirebase开发Ionic5-angular应用程序,我在firestore数据库中有以下集合,其中partners是用户的文档引用数组。我想显示所有公寓列表以及合作伙伴的姓名(用户集合中的名字和姓氏)。当我使用一套公寓的ID进行查询并从其他集合中获取其他详细信息时,我能够编写查询以正确获取数据。然而,当我试图获得所有公寓的所有其他细节,如在本例中的用户,我挣扎

当我有公寓id时获取一个公寓详细信息的方法:

getApartmentById(aptId: string) {
return this.afs.collection('Apartment').doc<apartment>(aptId).snapshotChanges()
  .pipe(
    switchMap(apart => {
      return combineLatest(
        of(apart),
        combineLatest(
          this.afs.collection<address>('Address', ref => ref.where('ApartmentID', '==', apart.payload.ref)).snapshotChanges()
            .pipe(
              map(addresses => {
                const data = addresses[0].payload.doc.data() as address;
                const id = addresses[0].payload.doc.id;
                return { id, ...data };
              })
            )
        ),
        combineLatest(
          this.afs.doc<apartmentType>(apart.payload.data().Type).snapshotChanges()
            .pipe(
              map(atype => {
                //console.log(atype.payload.id);
                const data = atype.payload.data() as apartmentType;
                const id = atype.payload.id;
                return { id, ...data };
              })
            )
        ),
        combineLatest(
          this.afs.collection<phone>('Phone', ref => ref.where('ApartmentID', '==', apart.payload.ref)).snapshotChanges()
            .pipe(
              map(phones => {
                const data = phones[0].payload.doc.data() as phone;
                const id = phones[0].payload.doc.id;
                return { id, ...data };
              })
            )
        )
      )
    }),
    map(([apart, add, room, phn]) => {
      //console.log(add);
      return {
        apartment: apart.payload.data(),
        address: add[0],
        apartmenttype: room[0],
        phone: phn[0]
      }

    })
  );

有了这两个功能就应该能够实现它

其思想是使用一个类似于您所拥有的函数的函数,该函数获取每个单元,第二个函数获取数组中的所有单元引用,并使用map将第一个函数应用于数组的所有元素

getApartment(apt: DocumentReference) {

return apt.snapshotChanges()
  .pipe(
    switchMap(apart => {
      return combineLatest(
        of(apart),
        combineLatest(
          this.afs.collection<address>('Address', ref => ref.where('ApartmentID', '==', apart.payload.ref)).snapshotChanges()
            .pipe(
              map(addresses => {
                const data = addresses[0].payload.doc.data() as address;
                const id = addresses[0].payload.doc.id;
                return { id, ...data };
              })
            )
        ),
        combineLatest(
          this.afs.doc<apartmentType>(apart.payload.data().Type).snapshotChanges()
            .pipe(
              map(atype => {
                //console.log(atype.payload.id);
                const data = atype.payload.data() as apartmentType;
                const id = atype.payload.id;
                return { id, ...data };
              })
            )
        ),
        combineLatest(
          this.afs.collection<phone>('Phone', ref => ref.where('ApartmentID', '==', apart.payload.ref)).snapshotChanges()
            .pipe(
              map(phones => {
                const data = phones[0].payload.doc.data() as phone;
                const id = phones[0].payload.doc.id;
                return { id, ...data };
              })
            )
        )
      )
    }),
    map(([apart, add, room, phn]) => {
      //console.log(add);
      return {
        apartment: apart.payload.data(),
        address: add[0],
        apartmenttype: room[0],
        phone: phn[0]
      }

    })
  );   
}

getAllApartments(){
    return this.afs.collection('Apartment').listDocuments().then({docsRef =>
        return docsRef.map(getApartment());
        });
    });
}
get公寓(apt:DocumentReference){
返回apt.snapshotChanges()
.烟斗(
开关映射(分开=>{
返回组合测试(
属于(分开),
组合测试(
this.afs.collection('Address',ref=>ref.where('ApartmentID','=',apart.payload.ref)).snapshotChanges()
.烟斗(
地图(地址=>{
const data=addresses[0]。payload.doc.data()作为地址;
const id=地址[0]。payload.doc.id;
返回{id,…data};
})
)
),
组合测试(
this.afs.doc(partition.payload.data().Type).snapshotChanges()
.烟斗(
映射(atype=>{
//日志(atype.payload.id);
const data=atype.payload.data()作为apartmentType;
const id=atype.payload.id;
返回{id,…data};
})
)
),
组合测试(
this.afs.collection('Phone',ref=>ref.where('ApartmentID','=',apart.payload.ref)).snapshotChanges()
.烟斗(
地图(电话=>{
const data=phones[0]。payload.doc.data()作为phone;
const id=phones[0].payload.doc.id;
返回{id,…data};
})
)
)
)
}),
地图([分隔、添加、房间、phn])=>{
//控制台日志(添加);
返回{
单元:partment.payload.data(),
地址:添加[0],
公寓类型:房间[0],
电话:phn[0]
}
})
);   
}
GetAllPartments(){
返回此.afs.collection('partment').listDocuments()。然后({docsRef=>
返回docsRef.map(get公寓());
});
});
}

感谢您的回复。但这是行不通的,因为如果您注意到partners是每个单元文档中的数组,partners数组中的每个元素都必须与Users文档进行映射。在JS中,数组可以是ob对象,getpartment返回与代码中相同的结构,代码中唯一的修改是它使用引用,而不是ID。获取所有引用的代码会获取引用,然后将引用映射到getApartment,getApartment会给出单元结构,并将它们映射到数组中。可能我没有获取它。你能根据截图中的数据结构为我在问题中提到的输出编写简单的查询吗?提前谢谢!这个问题没有答案??
getApartment(apt: DocumentReference) {

return apt.snapshotChanges()
  .pipe(
    switchMap(apart => {
      return combineLatest(
        of(apart),
        combineLatest(
          this.afs.collection<address>('Address', ref => ref.where('ApartmentID', '==', apart.payload.ref)).snapshotChanges()
            .pipe(
              map(addresses => {
                const data = addresses[0].payload.doc.data() as address;
                const id = addresses[0].payload.doc.id;
                return { id, ...data };
              })
            )
        ),
        combineLatest(
          this.afs.doc<apartmentType>(apart.payload.data().Type).snapshotChanges()
            .pipe(
              map(atype => {
                //console.log(atype.payload.id);
                const data = atype.payload.data() as apartmentType;
                const id = atype.payload.id;
                return { id, ...data };
              })
            )
        ),
        combineLatest(
          this.afs.collection<phone>('Phone', ref => ref.where('ApartmentID', '==', apart.payload.ref)).snapshotChanges()
            .pipe(
              map(phones => {
                const data = phones[0].payload.doc.data() as phone;
                const id = phones[0].payload.doc.id;
                return { id, ...data };
              })
            )
        )
      )
    }),
    map(([apart, add, room, phn]) => {
      //console.log(add);
      return {
        apartment: apart.payload.data(),
        address: add[0],
        apartmenttype: room[0],
        phone: phn[0]
      }

    })
  );   
}

getAllApartments(){
    return this.afs.collection('Apartment').listDocuments().then({docsRef =>
        return docsRef.map(getApartment());
        });
    });
}