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}
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:
Explicación:
$lookup
para unir la colecciónVenue
con la colecciónuser
utilizando el campo_id
deVenue
y el campovenue_id
deuser
.$lookup
para unir los documentos resultantes con la colecciónshow
utilizando el campo_id
deuser
y el campohost_id
deshow
.$project
para proyectar los campos_id
,name
yduration
. El campoduration
se calcula utilizando el operador$sum
sobre el campoduration
del array anidadoshows
.La salida de la consulta anterior sería:
Esto nos muestra todos los lugares con su correspondiente suma de duración de los shows donde el usuario está asociado a ese lugar.