MongoDB-Aggregationsvergleich: group (), $ group und MapReduce
Ich bin etwas verwirrt darüber, Wann die Gruppe(), Aggregat mit $Gruppe oder mapreduce. Ich Lesen Sie die Dokumentation zu http://www.mongodb.org/display/DOCS/Aggregation für die Gruppe(), http://docs.mongodb.org/manual/reference/aggregation/group/#_S_group für $group.. Ist Splitter die einzige situation, wo die Gruppe() funktioniert nicht? Auch, bekomme ich das Gefühl, dass die $ - Gruppe ist mächtiger als Gruppe (), weil es kann verwendet werden, in Verbindung mit anderen pipeline-Betreiber aus der aggregation framework.. Wie funktioniert $Gruppe zu vergleichen, die mit mapreduce? Ich habe irgendwo gelesen, dass es erzeugt keine temporären Sammlung in der Erwägung, dass mapreduce tut. Ist das so?
Kann jemand präsentieren eine illustration oder mir den guide mal einen link, wo diese drei Begriffe erläutert werden, zusammen, wobei die gleiche sample-Daten, so kann ich Sie vergleichen bequem?
EDIT:
Auch, es wäre toll, wenn Sie darauf hinweisen, etwas neues konkret in diesen Befehlen seit der neuen 2.2 Version rauskam..
InformationsquelleAutor der Frage Aafreen Sheikh | 2012-09-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist etwas verwirrend, da die Namen ähnlich sind, aber die
group()
- Befehl ist eine andere Funktion und Umsetzung von$group
pipeline-operator in der Aggregation Framework.Der Gruppe () - Befehl, Aggregation-Framework und MapReduce sind gemeinsam Aggregationsfunktionen von MongoDB. Es gibt einige überschneidungen in den Funktionen, aber ich werde versuchen zu erklären, die Unterschiede und Grenzen der jeweiligen wie bei MongoDB 2.2.0.
Hinweis: inline-Ergebnis setzt unten genannten beziehen sich auf Abfragen, die bearbeitet werden, im Speicher-mit Ergebnissen, die zurückgegeben werden am Ende des Funktionsaufrufs. Alternative output-Optionen (derzeit nur verfügbar mit MapReduce) könnte beinhalten, Ergebnisse speichern, um eine neue oder eine vorhandene Sammlung.
group()
BefehlEinfache syntax und Funktionen für die Gruppierung .. Analog zu
GROUP BY
in SQL.Ergebnis-set inline (als ein array von gruppierten Elementen).
Realisiert durch die JavaScript-engine; benutzerdefinierte
reduce()
Funktionen werden in JavaScript geschrieben.Aktuellen Einschränkungen
Wird keine Gruppe in ein ResultSet mit mehr als 20.000 keys.
Ergebnisse müssen passen innerhalb der Grenzen eines BSON-Dokuments (derzeit 16MB).
Nimmt eine Lesesperre und nicht zulassen, dass andere threads zum ausführen von JavaScript während der Ausführung.
Funktioniert nicht mit sharded Sammlungen.
Siehe auch: Gruppe () - Befehl Beispiele.
MapReduce
Implementiert die MapReduce-Modell für die Verarbeitung von großen Datensätzen.
Können wählen Sie aus einer von mehreren Ausgabeoptionen (inline, neue Kollektion, merge, replace, reduce")
MapReduce-Funktionen sind in JavaScript geschrieben.
Unterstützt non-sharded und sharded-Eingang Sammlungen.
Kann verwendet werden, für die inkrementelle aggregation über große Sammlungen.
MongoDB 2.2 implementiert eine weit bessere Unterstützung für sharded Karte reduzieren Ausgabe.
Aktuellen Einschränkungen
Einer einzelnen Strahlen immer nur die Hälfte von MongoDB ist die maximale BSON-Dokument Größe (16MB).
Es ist eine JavaScript-Sperre, so dass eine mongod server kann nur ausführen einer JavaScript-Funktion an einem Punkt in der Zeit .. aber die meisten Schritte des MapReduce sind sehr kurz, so können die sperren werden Häufig ergab.
MapReduce-Funktionen kann schwierig sein, zu Debuggen. Sie können
print()
undprintjson()
zu gehören Diagnose-Ausgabe in dermongod
melden.MapReduce ist in der Regel nicht intuitiv für Programmierer, die versuchen zu übersetzen, relationale Abfrage-aggregation Erfahrung.
Siehe auch: Map/reduce-Beispiele.
Aggregation Framework
Neues feature in der MongoDB 2.2.0 Produktions-release (August, 2012).
Entwickelt, mit dem spezifische Ziele Verbesserung der performance und usability.
Ergebnis-set-inline.
Unterstützt non-sharded und sharded-Eingang Sammlungen.
Verwendet eine "pipeline" - Ansatz, wo Objekte transformiert werden, wie Sie passieren durch eine Reihe von pipeline-Betreiber wie passende, Projektion, Sortierung und Gruppierung.
Pipeline-Betreiber müssen nicht produzieren einen output-Dokument für jedes input-Dokument: die Betreiber können auch neue Dokumente generiert oder filtern von Dokumenten.
Unter Verwendung von Projektionen können Sie fügen Sie berechnete Felder erstellen Sie neue virtuelle sub-Objekte, und extrahieren von sub-Felder in der top-level-Ergebnisse.
Pipeline-Betreiber wiederholt werden kann wie nötig (zum Beispiel mehrere
$project
oder$group
Schritte.Aktuellen Einschränkungen
Ergebnisse werden zurückgegeben, inline, so sind beschränkt auf die maximale Größe der Dokumente vom server unterstützt (16MB)
Nicht so viele Ausgabeoptionen, wie MapReduce
Beschränkt auf Operatoren und Ausdrücke unterstützt durch die Aggregation Framework (also nicht schreiben können benutzerdefinierte Funktionen),
Neueste server-Funktion für die aggregation, so hat Sie mehr Platz zum Reifen in Bezug auf Dokumentation, feature-set, und Nutzung.
Siehe auch: Aggregation Framework-Beispiele.
Sie in der Regel nicht finden werden, sind Beispiele, in denen es nützlich sein würde, zu vergleichen, alle drei Ansätze, aber auch hier sind Vorherige StackOverflow-Fragen, die zeigen Variationen:
InformationsquelleAutor der Antwort Stennie