Estoy usando la base de datos de Cloud Firestore para almacenar documentos para el usuario dentro de una aplicación next.js, la ruta de recopilación es la siguiente
collection "userDocs" └─ document "userEmail" └─ collection "docs" └─ document "documentObject"Estaba usando el SDK de Firebase v9 y cambié a firebase v8 y sigo teniendo el mismo problema.
Este fragmento de código es donde agrego un nuevo documento a la base de datos que se realiza y se refleja correctamente en la consola de Firebase
db.collection("userDocs").doc(session.user.email).collection("docs").add({ fileName: input, timestamp: firebase.firestore.FieldValue.serverTimestamp(), });Al intentar obtener documentos de la base de datos, probé los siguientes enfoques:
const [snapshot] = useCollectionOnce( db .collection("userDocs") .doc(session?.user.email) .collection("docs") .orderBy("timestamp", "desc") ); useEffect(() => { var query = db.collection("userDocs"); query.get().then((querySnapshot) => { querySnapshot.forEach((document) => { document.ref .collection("docs") .get() .then((querySnapshot) => { console.log(querySnapshot); }); }); }); });Así es como traté de lograrlo usando firebase v9
import { collection, query, orderBy, serverTimestamp, setDoc, doc, collectionGroup, onSnapshot, getDocs, } from "firebase/firestore"; useEffect(async () => { const docRef = query( collection(db, "UserDocs", session?.user.email, "Docs"), orderBy("timestamp", "desc") ); const docSnap = await getDocs(docRef); const allDocs = docSnap.forEach((doc) => { console.log(`Document ${doc.id} contains ${JSON.stringify(doc.data())}`); }); }, []);El problema era que no estabas estructurando tus datos correctamente. Como se muestra en la documentación oficial de Firebase Elija una estructura de datos ,
cuando estructura sus datos en Cloud Firestore, tiene algunas opciones diferentes:
- Documentos
- Múltiples colecciones
- Subcolecciones dentro de documentos
Considere las ventajas de cada opción en relación con su caso de uso
Por lo tanto, a partir del código que ha compartido en su respuesta, la estructura que está utilizando es Datos anidados en documentos .
Me perdí un poco en su primer enfoque, pero dado que finalmente lo hizo funcionar, el consejo es estructurar sus datos de acuerdo con lo que se indica en la documentación y lo que se ajusta a sus necesidades.
Ver también
Me las arreglé para solucionar esto usando el siguiente enfoque:
1- Reestructuré mi base de datos para contener una colección de "docs" que contiene un objeto de documento que tiene los siguientes atributos {email, fileName, timestamp} en lugar de crear una subcolección.
Creé el siguiente método para obtener datos y mapearlos en una matriz de estado para poder representarlos
const getDocuments = async () => { await db .collection("docs") .where("email", "==", session?.user.email) .orderBy("timestamp", "desc") .get() .then((res) => { setUserDocs(res.docs); }) .catch((error) => { console.log(error); }); };Todavía no estoy muy seguro de por qué funcionó exactamente este intento en lugar de todas las demás pruebas, pero logré hacer que las cosas funcionaran hasta ahora, así que eso es lo más importante por el momento.