Musisz użyć struktury agregacji, w której uruchomisz potok agregacji, który najpierw filtruje dokumenty w kolekcji na podstawie venueList
identyfikatory przy użyciu $match
operator.
Drugi potok pociąga za sobą spłaszczenie venueList
i suma
tablice poddokumentów w celu dalszego przetwarzania danych w dokumentach jako zdenormalizowane wpisy. $unwind
operator jest tutaj przydatny.
Kolejny filtr przy użyciu $match
jest konieczne po rozwinięciu, aby tylko dokumenty, które chcesz zagregować, są przepuszczane do następnego potoku.
Głównym rurociągiem byłby $grupa
etap operatora, który agreguje przefiltrowane dokumenty, aby utworzyć żądane sumy za pomocą operatora akumulatora $sum
. Aby uzyskać pożądany wynik, musiałbyś użyć operatora dziesiętnego, takiego jak $cond
aby utworzyć niezależne pola zliczania, ponieważ przekaże to liczbę dokumentów do $sum
wyrażenie w zależności od wartości nazwy.
Podsumowując, rozważ uruchomienie następującego potoku:
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
]
}
}
}
}
])
Do użytku z mGo możesz przekonwertować powyższy potok, korzystając ze wskazówek w http://godoc.org/labix.org/v2/mgo#Collection.Pipe
Aby uzyskać bardziej elastyczną i wydajniejszą alternatywę, która działa znacznie szybciej niż powyższe, a także uwzględnia nieznane wartości listy sum, uruchom alternatywny potok w następujący sposób
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"
}
}
}
}
])