Necesitaría usar el marco de agregación donde ejecutaría una canalización de agregación que primero filtra los documentos en la colección según la venueList
identificadores usando el $match
operador.
La segunda canalización implicaría aplanar la venueList
y sum
matrices de subdocumentos para que los datos de los documentos se procesen más adelante en la canalización como entradas desnormalizadas. El $unwind
El operador es útil aquí.
Otro filtro usando $match
es necesario después de desenrollar para que solo los documentos que desea agregar se permitan en la siguiente canalización.
La canalización principal sería $group
etapa de operador que agrega los documentos filtrados para crear las sumas deseadas utilizando el operador acumulador $sum
. Para obtener el resultado deseado, necesitaría usar un operador tenario como $cond
para crear los campos de conteo independientes, ya que eso alimentará la cantidad de documentos al $sum
expresión dependiendo del valor del nombre.
Poniendo todo esto en conjunto, considere ejecutar la siguiente canalización:
db.collection.aggregate([
{ "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
{ "$unwind": "$venueList" },
{ "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
{ "$unwind": "$venueList.sum" },
{
"$group": {
"_id": null,
"linux": {
"$sum": {
"$cond": [
{ "$eq": [ "$venueList.sum.name", "linux" ] },
"$venueList.sum.value", 0
]
}
},
"ubuntu": {
"$sum": {
"$cond": [
{ "$eq": [ "$venueList.sum.name", "ubuntu" ] },
"$venueList.sum.value", 0
]
}
}
}
}
])
Para usar con mGo, puede convertir la tubería anterior usando la guía en http://godoc.org/labix.org/v2/mgo#Collection.Pipe
Para obtener una alternativa más flexible y de mejor rendimiento que se ejecute mucho más rápido que la anterior y que también tenga en cuenta los valores desconocidos para la lista de suma, ejecute la canalización alternativa de la siguiente manera
db.collection.aggregate([
{ "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
{ "$unwind": "$venueList" },
{ "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
{ "$unwind": "$venueList.sum" },
{
"$group": {
"_id": "$venueList.sum.name",
"count": { "$sum": "$venueList.sum.value" }
}
},
{
"$group": {
"_id": null,
"counts": {
"$push": {
"name": "$_id",
"count": "$count"
}
}
}
}
])