Vous devez utiliser le cadre d'agrégation dans lequel vous exécuterez un pipeline d'agrégation qui filtre d'abord les documents de la collection en fonction de la venueList
identifiants en utilisant $match
opérateur.
Le deuxième pipeline impliquerait d'aplatir la venueList
et sum
tableaux de sous-documents afin que les données des documents soient traitées plus loin dans le pipeline en tant qu'entrées dénormalisées. Le $unwind
L'opérateur est utile ici.
Un autre filtre utilisant $match
est nécessaire après le déroulement afin que seuls les documents que vous souhaitez regrouper soient autorisés dans le pipeline suivant.
Le pipeline principal serait le $group
étape d'opérateur qui agrège les documents filtrés pour créer les sommes souhaitées à l'aide de l'opérateur d'accumulateur $sum
. Pour le résultat souhaité, vous devrez utiliser un opérateur tenary comme $cond
pour créer les champs de comptage indépendants car cela fournira le nombre de documents au $sum
expression en fonction de la valeur du nom.
En résumé, envisagez d'exécuter le pipeline suivant :
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
]
}
}
}
}
])
Pour une utilisation avec mGo, vous pouvez convertir le pipeline ci-dessus en suivant les instructions de http ://godoc.org/labix.org/v2/mgo#Collection.Pipe
Pour une alternative plus flexible et plus performante qui s'exécute beaucoup plus rapidement que ci-dessus, et prend également en considération les valeurs inconnues pour la liste de somme, exécutez le pipeline alternatif comme suit
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"
}
}
}
}
])