Angularfire2& Firestore - 检索集合列表的所有子集合内容

时间:2017-12-27 21:10:58

标签: angularfire2 google-cloud-firestore

我尝试根据第一次调用时收到的密钥检索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 };
      })
    })
  }

1 个答案:

答案 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