Benoit
Benoit

Reputation: 472

Angularfire2 & Firestore – retrieve all subcollection content for a collection list

I try to retrieve datas in a subcollection based on the key received on the first call. Basically, I want a list of all my user with the total of one subcollection for each of them.

I'm able to retrieve the data from the first Payload, but not from pointRef below

What is the correct way to achieve that?

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

Upvotes: 0

Views: 1731

Answers (1)

Makah
Makah

Reputation: 4523

I tried to put my code in a comment, but I think it's better formated as a answer.

First you need subscribe your pointRef and you can change your code like this.

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

And if you going to use this function alot, you should start to denormalize your data.

Upvotes: 1

Related Questions