Sie müssten das Aggregationsframework verwenden, in dem Sie eine Aggregationspipeline ausführen würden, die zuerst die Dokumente in der Sammlung basierend auf der venueList
filtert ids mit dem $match
Operator.
Die zweite Pipeline würde das Abflachen der venueList
beinhalten und sum
Unterdokumentarrays, damit die Daten in den Dokumenten weiter unten in der Pipeline als denormalisierte Einträge verarbeitet werden können. Der $unwind
Operator ist hier nützlich.
Ein weiterer Filter mit $match
ist nach dem Entladen erforderlich, damit nur die Dokumente, die Sie aggregieren möchten, in die nächste Pipeline zugelassen werden.
Die Hauptpipeline wäre der $group
-Operatorstufe, die die gefilterten Dokumente aggregiert, um mithilfe des Akkumulatoroperators $sum
. Für das gewünschte Ergebnis müssten Sie einen Zehneroperator wie $cond
um die unabhängigen Zählfelder zu erstellen, da dies die Anzahl der Dokumente in $sum
Ausdruck abhängig vom Namenswert.
Alles in allem sollten Sie die folgende Pipeline ausführen:
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
]
}
}
}
}
])
Für die Verwendung mit mGo können Sie die obige Pipeline mithilfe der Anleitung in http umwandeln://godoc.org/labix.org/v2/mgo#Collection.Pipe
Für eine flexiblere und leistungsstärkere Alternative, die viel schneller als oben ausgeführt wird und auch unbekannte Werte für die Summenliste berücksichtigt, führen Sie die alternative Pipeline wie folgt aus
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"
}
}
}
}
])