2017-12-27 20 views
0

Ich versuche, Daten in einem subcollection basierend auf dem Schlüssel beim ersten Anruf erhalten abrufen. Grundsätzlich möchte ich eine Liste aller meiner Benutzer mit der Summe von einer Untersammlung für jeden von ihnen.Angularfire2 & Firestore - Abrufen aller Subcollection Inhalte für eine Sammelliste

Ich bin in der Lage, die Daten aus dem ersten Payload abzurufen, aber nicht von pointRef unter

Was ist der richtige Weg, dies zu erreichen?

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 }; 
     }) 
    }) 
    } 

Antwort

1

Ich habe versucht, meinen Code in einen Kommentar zu setzen, aber ich denke, es ist besser als Antwort formatiert.

Zuerst müssen Sie Ihre pointRef abonnieren und Sie können Ihren Code so ändern.

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); 

Und wenn Sie diese Funktion eine Menge nicht benutzen wollen, sollten Sie auf denormalize your data starten.

+0

Danke für Ihre Eingabe @Makah! Immer noch ein Problem mit der Ansicht. Ich kann "id" und "first_name" mit "

{{ (data.id)}}
" anzeigen, aber {{data.point}} gebe einfach ein [Objekt] zurück. Ich versuche async zu machen, benutze json, aber ich kann hier nichts sehen – Benoit

Verwandte Themen