Du skal bruge aggregeringsrammen, hvor du vil køre en aggregeringspipeline, der først filtrerer dokumenterne i samlingen baseret på venueList
id'er ved hjælp af $match
operatør.
Den anden pipeline ville indebære en fladning af venueList
og sum
underdokumentarrays for at dataene i dokumenterne kan behandles længere nede i pipelinen som denormaliserede posteringer. $unwind
operatør er nyttig her.
Et yderligere filter ved hjælp af $match
er nødvendig efter afvikling, så kun de dokumenter, du ønsker at samle, er tilladt i den næste pipeline.
Hovedpipelinen ville være $gruppe
operatørtrin, som samler de filtrerede dokumenter for at skabe de ønskede summer ved hjælp af akkumulatoroperatoren $sum
. For at opnå det ønskede resultat skal du bruge en tenary operator som $cond
at oprette de uafhængige optællingsfelter, da det vil føre antallet af dokumenter til $sum
udtryk afhængigt af navneværdien.
Overvej at køre følgende pipeline:
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
]
}
}
}
}
])
Til brug med mGo kan du konvertere ovenstående pipeline ved hjælp af vejledningen i http://godoc.org/labix.org/v2/mgo#Collection.Pipe
For et mere fleksibelt og bedre ydende alternativ, som udføres meget hurtigere end ovenstående, og som også tager hensyn til ukendte værdier for sumlisten, skal du køre den alternative pipeline som følger
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"
}
}
}
}
])