Ще трябва да използвате рамката за агрегиране, където ще стартирате конвейер за агрегиране, който първо филтрира документите в колекцията въз основа на venueList
идентификатори с помощта на $matchкод>
оператор.
Вторият конвейер ще доведе до изравняване на venueList
и сума
масиви от поддокументи, за да могат данните в документите да бъдат обработени по-нататък по тръбопровода като денормализирани записи. $unwind
операторът е полезен тук.
Допълнителен филтър, използващ $match
е необходимо след отвиване, така че само документите, които искате да обедините, да бъдат допуснати в следващия конвейер.
Основният тръбопровод ще бъде $group
етап на оператор, който агрегира филтрираните документи, за да създаде желаните суми, като използва оператора за акумулиране $sum
. За желания резултат ще трябва да използвате тенарен оператор като $cond
за създаване на независими полета за преброяване, тъй като това ще подаде броя документи към $sum
израз в зависимост от стойността на името.
Събирайки всичко това, обмислете изпълнението на следния конвейер:
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
]
}
}
}
}
])
За използване с mGo можете да конвертирате горния конвейер, като използвате указанията в http://godoc.org/labix.org/v2/mgo#Collection.Pipe
За по-гъвкава и по-добре производителна алтернатива, която се изпълнява много по-бързо от горното и също така взема предвид неизвестни стойности за списъка със суми, стартирайте алтернативния конвейер, както следва
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"
}
}
}
}
])