Cómo listar todos los documentos en una subcolección y luego obtener sus documentos por su ID?
Estoy tratando de mostrar los datos de un documento dentro de una colección entre “estudiantes” y sus “cursos”.
Estoy usando html, javascript y esta estructura, pero hasta ahora solo puedo obtener el ID del documento, pero me gustaría acceder también a los datos dentro de este documento.
async function fetchCourses() {
const studentId = firebase.auth().currentUser.uid
const courseIds = await db.collection('students/${studentId}/attending').get();
const courseDocs = await Promise.all(
courseIds.docs.map(doc => db.doc('courses/${doc.id},${studentId}').get())
);
return courseDocs.filter(doc => doc.exists).map(doc => ({ id: doc.id, ...doc.data() }),
console.log(courseDocs));
}
Mi console.log muestra todo esto:
Cualquier ayuda es apreciada.
Edit:
Esta es la estructura de datos dentro de mi Firebase:
Los “estudiantes” se almacenan en una colección indexada por su uid y cada documento de estudiante contiene su nombre y más datos, pero lo más importante es una subcolección llamada “attending” que contiene documentos vacíos indexados por courseId, en referencia a un documento en la colección de “cursos”.
imagen de estructura de datos – estudiantes
Los “cursos” se almacenan en otra colección indexada por courseId y al igual que en “estudiantes”, cada documento del curso contiene un título y más datos, y una subcolección llamada “attendees” que contiene documentos vacíos indexados por uid, en referencia a un estudiante.
davy.ai
Para acceder a los datos dentro de un documento de una colección de “estudiantes” y “cursos”, puedes modificar la función
fetchCourses()
de la siguiente manera:En la función modificada, en lugar de utilizar una cadena concatenada para obtener la referencia del documento del curso (
db.doc(
courses/${doc.id},${studentId}).get()
), creamos una variablecourseRef
que se refiere al documento de la coleccióncourses
con el mismo id quedoc.id
(que es el id de un documento de curso en la colecciónstudents/${studentId}/attending
).Luego utilizamos
await
para obtener los datos del documentocourseRef
usandocourseRef.get()
. Luego retornamos un objeto que incluye elid
del documento de la colecciónstudents/${studentId}/attending
y los datos del documento correspondiente acourseRef
(...courseData.data()
).Finalmente, imprimimos en la consola el arreglo
courseDocs
y lo retornamos desde la funciónfetchCourses()
.Esto te permitirá acceder a los datos dentro del documento del curso desde la colección
students/${studentId}/attending
.