U moet het aggregatieraamwerk gebruiken waar u een aggregatiepijplijn zou uitvoeren die eerst de documenten in de verzameling filtert op basis van de venueList
id's met de $match
exploitant.
De tweede pijplijn zou leiden tot het afvlakken van de venueList
en sum
subdocumentarrays om de gegevens in de documenten verder in de pijplijn te verwerken als gedenormaliseerde invoer. De $unwind
operator is hier handig.
Nog een filter met $match
is nodig na het afwikkelen, zodat alleen de documenten die u wilt samenvoegen in de volgende pijplijn worden toegelaten.
De belangrijkste pijplijn is de $group
operatorfase die de gefilterde documenten samenvoegt om de gewenste sommen te creëren met behulp van de accumulatoroperator $sum
. Voor het gewenste resultaat moet u een tenary-operator gebruiken zoals $cond
om de onafhankelijke telvelden te maken, aangezien dat het aantal documenten zal voeden met de $sum
expressie afhankelijk van de naamwaarde.
Als u dit alles bij elkaar optelt, kunt u overwegen de volgende pijplijn te gebruiken:
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
]
}
}
}
}
])
Voor gebruik met mGo kunt u de bovenstaande pijplijn converteren met behulp van de richtlijnen in http://godoc.org/labix.org/v2/mgo#Collection.Pipe
Voor een flexibeler en beter presterend alternatief dat veel sneller wordt uitgevoerd dan het bovenstaande en ook rekening houdt met onbekende waarden voor de somlijst, voert u de alternatieve pijplijn als volgt uit
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"
}
}
}
}
])