Ich habe einen Prozess, den ich derzeit Mongos verwendeMap / Reduce Framework für, aber es funktioniert nicht sehr gut. Es ist eine ziemlich einfache Aggregation, bei der ich über 3 Felder bucketize, die Summe von 4 verschiedenen Feldern zurückgebe und die Werte für 4 weitere Felder durchlasse (die konstant sind) in jedem Eimer).
Aus in [ Map-Reduce-Leistung in MongoDb 2.2, 2.4 und 2.6 ], Ich möchte dies für eine bessere Leistung in das Aggregations-Framework umwandeln, aber es stehen drei Dinge im Weg, denke ich:
- Das Gesamtergebnis kann groß sein und die Grenze von 16 MB von Mongo überschreiten, auch wenn ein Dokument im Ergebnis sehr klein ist.
- Ich kann direkt auf eine andere Sammlung abbilden / verkleinern, aber das Aggregationsframework kann nur Ergebnisse inline zurückgeben (denke ich?).
- Für inkrementelle Aktualisierungen, wenn mehr Daten in der Quellensammlung ankommen, kann ich sie zuordnen / reduzieren
MapReduceCommand.OutputType
(in Java) setzen Sie aufREDUCE
, genau passend zu meinem Anwendungsfall, aber ich sehe keine entsprechende Funktionalität im Aggregationsframework.
Gibt es gute Möglichkeiten, diese Probleme im Aggregationsrahmen zu lösen? Der Server ist derzeit Version 2.4.3 - wir können bei Bedarf neue Funktionen aktualisieren.
Antworten:
1 für die Antwort № 1Das Aggregationsframework kann derzeit nicht direkt an eine andere Sammlung ausgegeben werden. Sie können jedoch die Antwort in dieser Diskussion versuchen: SO-Fragen-Ausgabe-Aggregat für neue Sammlung Die Mapreduce ist viel langsamer und ich war es auch schonWarten auf eine Lösung. Sie können den Hadoop-zu-Mongodb-Anschluss ausprobieren, der auf der Mongodb-Website unterstützt wird. Hadoop ist schneller in Mapreduce. Ich weiß jedoch nicht, ob es in Ihrem speziellen Fall gut geeignet wäre.
Link zu hadoop + MongoDB-Connector
Alles Gute.
3 für die Antwort № 2
Das kannst du jetzt mit machen raus wie im mongo erklärt
$ out Nimmt die vom zurückgegebenen Dokumente zurückAggregationspipeline und schreibt sie in eine angegebene Sammlung. Mit dem Operator $ out kann das Aggregationsframework Ergebnismengen beliebiger Größe zurückgeben. Der $ out-Operator muss die letzte Stufe der Pipeline sein.
Der Befehl hat die folgende Syntax, wobei 'collection' die Ausgabe der Aggregationsoperation enthält. $ out ist nur am Ende der Pipeline zulässig:
db.<collection>.aggregate( [
{ <operation> },
{ <operation> },
...,
{ $out : "<output-collection>" }
] )