Estaba usando el modo de encadenamiento de Firestore Web 8, pero estoy en camino de actualizarlo al Módulo 9 y ha sido difícil tratar de descubrir cómo obtener todo el contenido de mi subcolección (colección dentro de mi colección) .
Mi función anterior es así y funciona bien:
function getInfo(doc_name) { let infoDB = db .collection("collection_name") .doc(doc_name) .collection("subcollection_name") .get(); return alunoHistorico; }
así que con la forma del módulo probé este código
// Initialize Firebase const app = initializeApp(firebaseConfig); const db = getFirestore(app); const docRef = doc(db, "collection_name", "doc_name"); const docSnap = await getDoc(docRef); if (docSnap.exists()) { console.log("Document data:", docSnap.data()); } else { // doc.data() will be undefined in this case console.log("No such document!"); }
pero la función doc () espera argumentos pares (sin contar el argumento db), por lo que si trato de usar con 3 argumentos como este, aparece un error:
const docRef = doc(db, "collection_name", "doc_name", "subcollection_name");
para que funcione tengo que pasar el documento exacto que esta dentro de la subcolección
const docRef = doc(db, "collection_name", "doc_name", "subcollection_name", "sub_doc");
pero no me funciona porque tengo una lista de documentos dentro de la subcolección que quiero recuperar. Entonces, ¿cómo puedo obtener todos mis documentos dentro de mi subcolección?
Gracias a cualquiera que se tome el tiempo.
Debe usar collection()
para obtener una CollectionReference
en lugar de doc()
que devuelve una DocumentReference
:
const subColRef = collection(db, "collection_name", "doc_name", "subcollection_name"); // odd number of path segments to get a CollectionReference // equivalent to: // .collection("collection_name/doc_name/subcollection_name") in v8 // use getDocs() instead of getDoc() to fetch the collection const qSnap = getDocs(subColRef) console.log(qSnap.docs.map(d => ({id: d.id, ...d.data()})))
Escribí una respuesta detallada sobre la diferencia entre doc()
y collection()
(en V8
y V9
) aquí:
Firestore: ¿Cuál es el patrón para agregar nuevos datos en Web v9?
Si alguien quiere obtener actualizaciones en tiempo real de documentos dentro de la subcolección usando onSnapshot en Modular Firebase V9, puede lograr esto como:
import { db } from "./firebase"; import { onSnapshot, collection } from "@firebase/firestore"; let collectionRef = collection(db, "main_collection_id", "doc_id", "sub_collection_id"); onSnapshot(collectionRef, (querySnapshot) => { querySnapshot.forEach((doc) => { console.log("Id: ", doc.id, "Data: ", doc.data()); }); });