Back

Explore Courses Blog Tutorials Interview Questions
0 votes
2 views
in GCP by (19.7k points)
recategorized by

Let's say we have a root collection named 'todos'.

Every document in this collection has:

  1. title: String
  2. subcollection named todo_items

Every document in the subcollection todo_items has

  1. title: String
  2. completed: Boolean

I know that querying in Cloud Firestore is shallow by default, which is great, but is there a way to query the todos and get results that include the subcollection todo_items automatically?

In other words, how do I make the following query include the todo_items subcollection?

db.collection('todos').onSnapshot((snapshot) => {

  snapshot.docChanges.forEach((change) => {

    // ...

  });

});

closed

1 Answer

+2 votes
by (62.9k points)
selected by
 
Best answer

I am here using AngularFirestore (afs) and Typescript, refer the code below:

import { map, flatMap } from 'rxjs/operators';

import { combineLatest } from 'rxjs';

interface DocWithId {

  id: string;

}

convertSnapshots<T>(snaps) {

  return <T[]>snaps.map(snap => {

    return {

      id: snap.payload.doc.id,

      ...snap.payload.doc.data()

    };

  });

}

getDocumentsWithSubcollection<T extends DocWithId>(

    collection: string,

    subCollection: string

  ) {

    return this.afs

      .collection(collection)

      .snapshotChanges()

      .pipe(

        map(this.convertSnapshots),

        map((documents: T[]) =>

          documents.map(document => {

            return this.afs

             .collection(`${collection}/${document.id}/${subCollection}`)

              .snapshotChanges()

              .pipe(

                map(this.convertSnapshots),

                map(subdocuments =>

                  Object.assign(document, { [subCollection]: subdocuments })

                )

              );

          })

        ),

        flatMap(combined => combineLatest(combined))

      );

  }

  

Hope this helps!

 

Browse Categories

...