Budete muset použít agregační rámec, kde byste spustili agregační kanál, který nejprve filtruje dokumenty v kolekci na základě venueList
ID pomocí $match
operátor.
Druhý kanál by znamenal zploštění venueList
a sum
pole vnořených dokumentů, aby se data v dokumentech dále zpracovávala jako denormalizované záznamy. $unwind
operátor je zde užitečný.
Další filtr pomocí $match
je nutné po odvinutí, aby do dalšího kanálu byly povoleny pouze dokumenty, které chcete agregovat.
Hlavním kanálem by byl $group
fáze operátora, která agreguje filtrované dokumenty za účelem vytvoření požadovaných součtů pomocí operátoru akumulátoru $sum
. Pro požadovaný výsledek byste museli použít tenary operátor jako $cond
vytvořit nezávislá pole počtu, protože tím bude počet dokumentů přiváděn do $sum
výraz v závislosti na hodnotě názvu.
Když to shrneme, zvažte spuštění následujícího kanálu:
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
]
}
}
}
}
])
Pro použití s mGo můžete výše uvedený kanál převést pomocí pokynů v http://godoc.org/labix.org/v2/mgo#Collection.Pipe
Chcete-li flexibilnější a výkonnější alternativu, která se provádí mnohem rychleji než výše uvedená, a také bere v úvahu neznámé hodnoty v seznamu součtů, spusťte alternativní kanál následovně
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"
}
}
}
}
])