es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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:

imagen de la consola

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.

imagen de estructura de datos – cursos

Tags:  , ,

Answer

  1. Avatar for 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:

    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(async doc => {
          const courseRef = db.collection('courses').doc(doc.id);
          const courseData = await courseRef.get();
          return { id: doc.id, ...courseData.data() };
        })
      );
    
      console.log(courseDocs);
      return courseDocs;
    }
    

    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 variable courseRef que se refiere al documento de la colección courses con el mismo id que doc.id (que es el id de un documento de curso en la colección students/${studentId}/attending).

    Luego utilizamos await para obtener los datos del documento courseRef usando courseRef.get(). Luego retornamos un objeto que incluye el id del documento de la colección students/${studentId}/attending y los datos del documento correspondiente a courseRef (...courseData.data()).

    Finalmente, imprimimos en la consola el arreglo courseDocs y lo retornamos desde la función fetchCourses().

    Esto te permitirá acceder a los datos dentro del documento del curso desde la colección students/${studentId}/attending.

Comments are closed.