我尝试根据第一次调用时收到的密钥检索subcollection
中的数据。
基本上,我想要一个包含所有用户的列表,每个用户总共有一个子集合。
我可以从第一个有效负载中检索数据,但不能从下面的pointRef
检索数据
实现这一目标的正确方法是什么?
getCurrentLeaderboard() {
return this.afs.collection('users').snapshotChanges().map(actions => {
return actions.map(a => {
const data = a.payload.doc.data()
const id = a.payload.doc.id;
const pointRef: Observable<any> = this.afs.collection('users').doc(`${id}`).collection('game').valueChanges()
const points = pointRef.map(arr => {
const sumPoint = arr.map(v => v.value)
return sumPoint.length ? sumPoint.reduce((total, val) => total + val) : ''
})
return { id, first_name: data.first_name, point:points };
})
})
}
答案 0 :(得分:1)
我试图将我的代码放在评论中,但我认为它更好地形成了答案。
首先,您需要订阅pointRef
,然后就可以更改代码。
getCurrentLeaderboard() {
return this.afs.collection('users').snapshotChanges().map(actions => {
return actions.map(a => {
const data = a.payload.doc.data()
const id = a.payload.doc.id;
const pointRef: Observable<any> = this.afs.object(`users/${id}/game`).valueChanges() // <--- Here
const pointsObserver = pointRef.subscribe(points => { //<--- And Here
return { id, first_name: data.first_name, point:points };
})
})
}
....
//Usage:
getCurrentLeaderboard.subscribe(points => this.points = points);
如果你要使用这个功能,你应该开始denormalize your data。