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 anidado busca con suma

Necesito recuperar toda la jerarquía de objetos individuales de la base de datos como un JSON. Y al mismo tiempo sumar desde una colección anidada de 3 niveles.

Lugar

{"_id": "2", "nombre": "nombre2"}
{"_id": "3", "nombre": "nombre3"}
{"_id": "4", "nombre": "nombre4"}
{"_id": "5", "nombre": "nombre5"}

usuario

{"_id": "u2", "nombre": "u2", "venue_id": "2"}
{"_id": "u3", "nombre": "u3", "venue_id": "2"}
{"_id": "u4", "nombre": "u4", "venue_id": "3"}
{"_id": "u5", "nombre": "u5", "venue_id": "4"}

espectáculo

{"_id": "s2", "nombre": "s2", "host_id": "u2", "duración": 20}
{"_id": "s3", "nombre": "s3", "host_id": "u2", "duración": 50}
{"_id": "s4", "nombre": "s4", "host_id": "u2", "duración": 60}
{"_id": "s5", "nombre": "s5", "host_id": "u4", "duración": 30}

Necesito recuperar todos los lugares con la suma de la duración del espectáculo donde el usuario está asociado con ese lugar.

salida

{"_id": "2", "nombre": "nombre2", "duración": 130}
{"_id": "3", "nombre": "nombre3", "duración": 30}
{"_id": "4", "nombre": "nombre4", "duración": 0}
{"_id": "5", "nombre": "nombre5", "duración": 0}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para recuperar todos los lugares (venues) con la suma de la duración de los shows donde el usuario está asociado a ese lugar, podemos utilizar el framework de agregación de MongoDB. La siguiente consulta se puede utilizar para lograr esto:

    db.Venue.aggregate([
      {
        $lookup: {
          from: "user",
          localField: "_id",
          foreignField: "venue_id",
          as: "users"
        }
      },
      {
        $lookup: {
          from: "show",
          localField: "users._id",
          foreignField: "host_id",
          as: "shows"
        }
      },
      {
        $project: {
          _id: 1,
          name: 1,
          duration: { $sum: "$shows.duration" }
        }
      }
    ])
    

    Explicación:

    1. Primero, utilizamos la etapa $lookup para unir la colección Venue con la colección user utilizando el campo _id de Venue y el campo venue_id de user.
    2. Luego, utilizamos otra etapa $lookup para unir los documentos resultantes con la colección show utilizando el campo _id de user y el campo host_id de show.
    3. A continuación, utilizamos la etapa $project para proyectar los campos _id, name y duration. El campo duration se calcula utilizando el operador $sum sobre el campo duration del array anidado shows.
    4. Por último, los documentos resultantes se devuelven como salida.

    La salida de la consulta anterior sería:

    [
      {
        "_id": "2",
        "name": "name2",
        "duration": 130
      },
      {
        "_id": "3",
        "name": "name3",
        "duration": 30
      },
      {
        "_id": "4",
        "name": "name4",
        "duration": 0
      },
      {
        "_id": "5",
        "name": "name5",
        "duration": 0
      }
    ]
    

    Esto nos muestra todos los lugares con su correspondiente suma de duración de los shows donde el usuario está asociado a ese lugar.

Comments are closed.