How to list subcollections in a Cloud Firestore document

Viewed 12548

Say I have this minimal database stored in Cloud Firestore. How could I retrieve the names of subCollection1 and subCollection2?

rootCollection {
    aDocument: {
        someField: { value: 1 },
        anotherField: { value: 2 }
        subCollection1: ...,
        subCollection2: ...,
    }
}

I would expect to be able to just read the ids off of aDocument, but only the fields show up when I get() the document.

rootRef.doc('aDocument').get()
  .then(doc =>

    // only logs [ "someField", "anotherField" ], no collections
    console.log( Object.keys(doc.data()) )
  )
4 Answers

In Node.js you'll be after the 'ListCollectionIds' method

var firestore = require('firestore.v1beta1');

var client = firestore.v1beta1({
  // optional auth parameters.
});

// Iterate over all elements.
var formattedParent = client.anyPathPath("[PROJECT]", "[DATABASE]", "[DOCUMENT]", "[ANY_PATH]");

client.listCollectionIds({parent: formattedParent}).then(function(responses) {
    var resources = responses[0];
    for (var i = 0; i < resources.length; ++i) {
        // doThingsWith(resources[i])
    }
})
.catch(function(err) {
    console.error(err);
});

This is not currently supported in the client SDKs (Web, iOS, Android).

It seems like they have added a method called getCollections() to Node.js:

firestore.doc(`/myCollection/myDocument`).getCollections().then(collections => {
  for (let collection of collections) {
    console.log(`Found collection with id: ${collection.id}`);
  }
});

This example prints out all subcollections of the document at /myCollection/myDocument

This answer is in the docs

Sadly the docs aren't clear what you import.

Based on the docs, my code ended up looking like this:

import admin, { firestore } from 'firebase-admin'

let collections: string[] = null
const adminRef: firestore.DocumentReference<any> = admin.firestore().doc(path)
const collectionRefs: firestore.CollectionReference[] = await adminRef.listCollections()
collections = collectionRefs.map((collectionRef: firestore.CollectionReference) => collectionRef.id)

This is of course Node.js server side code. As per the docs, this cannot be done on the client.

Related