2017-12-27 28 views
0

最初の呼び出しで受け取ったキーに基づいてsubcollectionのデータを取得しようとしています。 基本的には、自分のすべてのユーザーのリストをそれぞれのサブコレクションの合計が1つ必要です。Angularfire2&Firestore - コレクションリストのすべてのサブコレクションコンテンツを取得します。

私は最初のペイロードからデータを取得することができるよ、ではなく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

私はコメントに自分のコードを入れようとしましたが、それは答えとして成り立っていると思います。

まず、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に開始する必要があります。

+0

入力いただきありがとうございます@マカ!まだこの見解には問題があります。私は 'id'と' first_name'を '

{{ (data.id)}}
'で表示できますが、{{data.point}}は[オブジェクト]を返すだけです。私はjsonを使って非同期にしようとしていますが、 – Benoit

関連する問題