Es gibt ein paar verschiedenen Ansätze, die Sie hier verwenden:
Verwenden Karte/reduzieren: dies nicht tun. Im Augenblick wäre es viel schneller, das Aggregationsframework dreimal auszuführen, als eine Map-Reduce-Funktion für diesen Anwendungsfall zu verwenden.
Aggregation 3 Mal ausführen. Dies ist nicht optimal, aber wenn Sie keine Zeitbeschränkungen haben, ist dies die einfachste Option. Wenn Ihre Aggregationen sowieso ein paar Sekunden dauern, würde ich mich nicht um die Optimierung kümmern, bis sie zu einem Problem werden.
Hier ist die beste Work-around, die ich mir vorstellen kann. Mit dem Operator $group
können Sie einen _id
für mehrere Felder erstellen. Z.B. {"_id":{"a":"$key1", "b":"$key2", "c":"$key3"}}
. Dadurch wird eine Gruppierung für alle vorhandenen Kombinationen Ihrer verschiedenen Schlüssel erstellt. Sie können die Schlüssel möglicherweise auf diese Weise gruppieren und dann manuell die Ergebnisse im Client summieren.
Lassen Sie mich näher ausführen. Nehmen wir an, wir haben eine Sammlung von Formen. Diese Formen können eine Farbe, eine Größe und eine Art (Quadrat, Kreis, usw.) haben. Eine Aggregation auf einem Multi-Key-Id könnte wie folgt aussehen:
db.shapes.aggregate({$group:{_id:{"f1":"$f1", "f2":"$f2", "f3":"$f3"}, count:{"$sum":1}}})
und zurück:
"result" : [
{
"_id" : {
"f1" : "yellow",
"f2" : "medium",
"f3" : "triangle"
},
"count" : 4086
},
{
"_id" : {
"f1" : "red",
"f2" : "small",
"f3" : "triangle"
},
"count" : 4138
},
{
"_id" : {
"f1" : "red",
"f2" : "big",
"f3" : "square"
},
"count" : 4113
},
{
"_id" : {
"f1" : "yellow",
"f2" : "small",
"f3" : "triangle"
},
"count" : 4145
},
{
"_id" : {
"f1" : "red",
"f2" : "small",
"f3" : "square"
},
"count" : 4062
}
... und so weiter
Sie würden dann die Ergebnisse clientseitige zusammenzufassen, über eine drastisch reduzierte Anzahl von Einträgen. Unter der Annahme, dass die Anzahl der eindeutigen Werte für jeden Schlüssel im Vergleich zur Gesamtzahl der Dokumente ausreichend klein ist, könnten Sie diesen letzten Schritt in einer vernachlässigbaren Zeit tun.