Du måste använda aggregeringsramverket där du kör en aggregeringspipeline som först filtrerar dokumenten i samlingen baserat på venueList
id som använder $match
operatör.
Den andra pipelinen skulle innebära att venueList
plattas till och summa
subdocument arrays för att data i dokumenten ska kunna bearbetas längre ner i pipelinen som denormaliserade poster. $unwind
operatör är användbar här.
Ytterligare ett filter med $match
är nödvändigt efter avveckling så att endast de dokument som du vill sammanställa tillåts i nästa pipeline.
Huvudledningen skulle vara $grupp
operatörssteg som aggregerar de filtrerade dokumenten för att skapa de önskade summorna med hjälp av ackumulatoroperatorn $summa
. För det önskade resultatet skulle du behöva använda en tenary operator som $cond
för att skapa de oberoende räkningsfälten eftersom det kommer att mata antalet dokument till $summa
uttryck beroende på namnvärdet.
Överväg att köra följande pipeline för att sammanställa detta:
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
]
}
}
}
}
])
För användning med mGo kan du konvertera ovanstående pipeline med hjälp av vägledningen i http://godoc.org/labix.org/v2/mgo#Collection.Pipe
För ett mer flexibelt och bättre presterande alternativ som körs mycket snabbare än ovanstående, och som även tar hänsyn till okända värden för summalistan, kör den alternativa pipelinen enligt följande
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"
}
}
}
}
])