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.

MongoDB pipeline de agregación proyecta varios valores del mismo id. El pipeline de agregación de MongoDB es una herramienta poderosa para realizar operaciones de consulta y transformación de datos en la base de datos. Una de las etapas más utilizadas en el pipeline de agregación es el proyecto, que permite seleccionar los campos específicos que deseamos obtener en el resultado de la consulta. Cuando necesitamos proyectar varios valores de un mismo id, podemos utilizar la etapa $group junto con la etapa $push. La etapa $group agrupa los documentos que tienen el mismo id, y la etapa $push permite almacenar los valores en un arreglo. Por ejemplo, supongamos que tenemos una colección llamada “usuarios” con los siguientes documentos: { “_id”: 1, “nombre”: “Juan”, “edad”: 25 } { “_id”: 2, “nombre”: “María”, “edad”: 30 } { “_id”: 1, “nombre”: “Pedro”, “edad”: 28 } Si queremos obtener todos los nombres de usuarios que tienen el mismo id, podemos utilizar el siguiente pipeline de agregación: db.usuarios.aggregate([ { $group: { _id: “$_id”, nombres: { $push: “$nombre” } } } ]) Este pipeline agrupará los documentos por el campo “_id” y almacenará los nombres en un arreglo llamado “nombres”. El resultado de la consulta sería el siguiente: { “_id”: 1, “nombres”: [“Juan”, “Pedro”] } { “_id”: 2, “nombres”: [“María”] } De esta manera, hemos logrado proyectar varios valores del mismo id utilizando el pipeline de agregación de MongoDB.

Estoy luchando con las tuberías de mongoDB. Estoy trabajando en una pila MERN que procesa datos.

Hacemos preguntas a las personas con un formulario, un formulario se describe como una sesión, por ejemplo, una sesión por cada persona. Cada sesión se registra en una tabla de esta manera:

{ _id: 1, created_at: "01/01/2021" }
{ _id: 2, created_at: "02/01/2021" }
{ _id: 3, created_at: "03/01/2021" }

Todas sus respuestas se almacenan en una tabla de esta manera, siendo sessionId la clave externa:

{ _id: 1, value: "Nombre1", sessionId: 1, typeofField: "nombre" }
{ _id: 2, value: "Apellido1", sessionId: 1, typeofField: "apellido" }
{ _id: 3, value: "Fecha de nacimiento1", sessionId: 1, typeofField: "fechanacimiento" }
{ _id: 4, value: "Nombre2", sessionId: 2, typeofField: "nombre" }
{ _id: 5, value: "Apellido2", sessionId: 2, typeofField: "apellido" }
{ _id: 6, value: "Fecha de nacimiento2", sessionId: 2, typeofField: "fechanacimiento" }

¿Cómo puedo proyectar estos datos para tener toda la información de una sesión en orden como esto?

{id: 1, created_at: "01/01/2021", nombre: "Nombre1", apellido: "Apellido1", fechanacimiento: "Fecha de nacimiento1" }
{id: 2, created_at: "02/01/2021", nombre: "Nombre2", apellido: "Apellido2", fechanacimiento: "Fecha de nacimiento2" }
Tags:  ,

Answer

  1. Avatar for davy.ai

    Puedes lograr el resultado deseado utilizando la tubería de agregación de MongoDB con las etapas $lookup y $project. Aquí tienes el ejemplo de consulta:

    db.sessions.aggregate([
      {
        $lookup: {
          from: "answers",
          localField: "_id",
          foreignField: "sessionId",
          as: "answers"
        }
      },
      {
        $project: {
          _id: 1,
          created_at: 1,
          name: { $arrayElemAt: [ { $filter: { input: "$answers", as: "answer", cond: { $eq: ["$$answer.typeofField", "name"] } } }, 0 ] },
          firstname: { $arrayElemAt: [ { $filter: { input: "$answers", as: "answer", cond: { $eq: ["$$answer.typeofField", "firstname"] } } }, 0 ] },
          birthdate: { $arrayElemAt: [ { $filter: { input: "$answers", as: "answer", cond: { $eq: ["$$answer.typeofField", "birthdate"] } } }, 0 ] }
        }
      },
      {
        $project: {
          _id: 1,
          created_at: 1,
          name: "$name.value",
          firstname: "$firstname.value",
          birthdate: "$birthdate.value"
        }
      }
    ])
    

    La primera etapa utiliza $lookup para unir la tabla de respuestas con la tabla de sesiones basándose en la clave externa sessionId. El resultado es un array de respuestas para cada sesión.

    La segunda etapa utiliza $project para extraer los campos relevantes de la tabla de sesiones y el array de respuestas utilizando los operadores $arrayElemAt y $filter para hacer coincidir cada respuesta por el valor de typeofField. Esta etapa también cambia el nombre de los valores de respuesta para que coincidan con el resultado deseado.

    La última etapa es opcional y proyecta los datos para eliminar los objetos de respuesta y mantener solo los valores. El resultado final debería ser lo que estás buscando.

    Nota: Asegúrate de sustituir los nombres reales de las colecciones por “sessions” y “answers” en la consulta.

Comments are closed.