Es gibt ein paar verschiedene Ansätze, die Sie hier verwenden könnten:
-
Karte verwenden/reduzieren:Tun Sie dies nicht. Im Moment wäre es viel schneller, das Aggregations-Framework dreimal auszuführen, als eine Map-Reduce-Funktion für diesen Anwendungsfall zu verwenden.
-
Führen Sie die Aggregation dreimal aus. Dies ist nicht optimal, aber wenn Sie keine zeitlichen Einschränkungen haben, ist dies die einfachste Option. Wenn Ihre Aggregationen ohnehin
-
Hier ist die beste Lösung, die ich mir vorstellen kann. Die
$group
-Operator können Sie eine_id
erstellen auf mehreren Feldern. 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önnten Ihre Schlüssel möglicherweise auf diese Weise gruppieren und dann die Ergebnisse im Client manuell summieren.
Lassen Sie mich näher darauf eingehen. 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 einer 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 clientseitig über eine drastisch reduzierte Anzahl von Einträgen zusammenfassen. 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 vernachlässigbarer Zeit erledigen.