Cómo enumerar subcolecciones en un documento de Cloud Firestore
Digamos que tengo esta base de datos mínima almacenada en Cloud Firestore. ¿Cómo podría recuperar los nombres de subCollection1
y subCollection2
?
rootCollection {
aDocument: {
someField: { value: 1 },
anotherField: { value: 2 }
subCollection1: ...,
subCollection2: ...,
}
}
Esperaría poder leer los identificadores de aDocument
, pero solo aparecen los campos cuando escribo get()
el documento.
rootRef.doc('aDocument').get()
.then(doc =>
// only logs [ "someField", "anotherField" ], no collections
console.log( Object.keys(doc.data()) )
)
Actualmente no se admite obtener una lista de (sub)colecciones de Firestore en los SDK del cliente (Web, iOS, Android). De la documentación :
No es posible recuperar una lista de colecciones con las bibliotecas del cliente web/móvil. Sólo debe buscar nombres de colecciones como parte de tareas administrativas en entornos de servidores confiables. Si descubre que necesita esta capacidad en las bibliotecas de clientes web/móviles, considere reestructurar sus datos para que los nombres de las subcolecciones sean predecibles.
En los SDK del lado del servidor, esta funcionalidad existe . Por ejemplo, en Node.js buscarás el ListCollectionIds
método:
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);
});
Parece que han agregado un método llamado getCollections()
a Node.js:
firestore.doc(`/myCollection/myDocument`).getCollections().then(collections => {
for (let collection of collections) {
console.log(`Found collection with id: ${collection.id}`);
}
});
Este ejemplo imprime todas las subcolecciones del documento en/myCollection/myDocument
Esta respuesta está en los documentos.
Lamentablemente, los documentos no dejan claro lo que importa.
Según los documentos, mi código terminó luciendo así:
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)
Por supuesto, este es el código del lado del servidor Node.js. Según los documentos, esto no se puede hacer en el cliente.