Cómo enumerar subcolecciones en un documento de Cloud Firestore

Resuelto skylize asked hace 54 años • 0 respuestas

Digamos que tengo esta base de datos mínima almacenada en Cloud Firestore. ¿Cómo podría recuperar los nombres de subCollection1y 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()) )
  )
skylize avatar Jan 01 '70 08:01 skylize
Aceptado

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 ListCollectionIdsmé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);
});
Dan McGrath avatar Oct 06 '2017 01:10 Dan McGrath

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

0xC0DEBA5E avatar Jan 16 '2018 09:01 0xC0DEBA5E

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.

danday74 avatar Aug 19 '2022 02:08 danday74