MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB-Aggregationsvergleich:group(), $group und MapReduce

Es ist etwas verwirrend, da die Namen ähnlich sind, aber die group() Der Befehl ist eine andere Funktion und Implementierung als die $group Pipeline-Operator im Aggregation Framework.

Der Befehl group(), Aggregation Framework und MapReduce sind zusammengenommen Aggregationsfunktionen von MongoDB. Es gibt einige Überschneidungen bei den Funktionen, aber ich werde versuchen, die Unterschiede und Einschränkungen der einzelnen Features in MongoDB 2.2.0 zu erklären.

Hinweis:Inline-Ergebnissätze Die unten erwähnten Abfragen beziehen sich auf Abfragen, die im Speicher verarbeitet werden und deren Ergebnisse am Ende des Funktionsaufrufs zurückgegeben werden. Alternative Ausgabeoptionen (derzeit nur mit MapReduce verfügbar) könnten das Speichern von Ergebnissen in einer neuen oder bestehenden Sammlung beinhalten.

group() Befehl

  • Einfache Syntax und Funktionalität zum Gruppieren .. analog zu GROUP BY in SQL.

  • Gibt die Ergebnismenge inline zurück (als Array gruppierter Elemente).

  • Implementiert mit der JavaScript-Engine; benutzerdefiniertes reduce() Funktionen können in JavaScript geschrieben werden.

  • Aktuelle Einschränkungen

    • Wird nicht in eine Ergebnismenge mit mehr als 20.000 Schlüsseln gruppiert.

    • Die Ergebnisse müssen in die Grenzen eines BSON-Dokuments passen (derzeit 16 MB).

    • Nimmt eine Lesesperre und erlaubt keinem anderen Thread, JavaScript auszuführen, während es läuft.

    • Funktioniert nicht mit fragmentierten Sammlungen.

  • Siehe auch:Beispiele für group()-Befehle .

MapReduce

  • Implementiert das MapReduce-Modell zur Verarbeitung großer Datensätze.

  • Kann aus einer von mehreren Ausgabeoptionen wählen (inline, neue Sammlung, zusammenführen, ersetzen, reduzieren)

  • MapReduce-Funktionen sind in JavaScript geschrieben.

  • Unterstützt nicht fragmentierte und fragmentierte Eingabesammlungen.

  • Kann für die inkrementelle Aggregation großer Sammlungen verwendet werden.

  • MongoDB 2.2 implementiert eine viel bessere Unterstützung für die reduzierte Ausgabe von Sharding Maps.

  • Aktuelle Einschränkungen

    • Eine einzelne Ausgabe kann nur die Hälfte der maximalen BSON-Dokumentgröße von MongoDB (16 MB) aufnehmen.

    • Es gibt eine JavaScript-Sperre, sodass ein Mongod-Server zu einem bestimmten Zeitpunkt nur eine JavaScript-Funktion ausführen kann. Die meisten Schritte von MapReduce sind jedoch sehr kurz, sodass Sperren häufig ausgeführt werden können.

    • MapReduce-Funktionen können schwierig zu debuggen sein. Sie können print() verwenden und printjson() Diagnoseausgabe in mongod aufzunehmen log.

    • MapReduce ist im Allgemeinen nicht intuitiv für Programmierer, die versuchen, Erfahrungen mit der Aggregation relationaler Abfragen zu übersetzen.

  • Siehe auch:Beispiele zuordnen/reduzieren .

Aggregations-Framework

  • Neue Funktion in der Produktionsversion von MongoDB 2.2.0 (August 2012).

  • Entwickelt mit spezifischen Zielen zur Verbesserung der Leistung und Benutzerfreundlichkeit.

  • Gibt die Ergebnismenge inline zurück.

  • Unterstützt nicht fragmentierte und fragmentierte Eingabesammlungen.

  • Verwendet einen „Pipeline“-Ansatz, bei dem Objekte transformiert werden, während sie eine Reihe von Pipeline-Operatoren durchlaufen, z. B. Abgleich, Projektion, Sortierung und Gruppierung.

  • Pipeline-Operatoren müssen nicht für jedes Eingabedokument ein Ausgabedokument erstellen:Operatoren können auch neue Dokumente generieren oder Dokumente herausfiltern.

  • Mithilfe von Projektionen können Sie berechnete Felder hinzufügen, neue virtuelle Unterobjekte erstellen und Unterfelder in die oberste Ergebnisebene extrahieren.

  • Pipeline-Operatoren können nach Bedarf wiederholt werden (z. B. mehrere $project oder $group Schritte.

  • Aktuelle Einschränkungen

    • Die Ergebnisse werden inline zurückgegeben und sind daher auf die maximale vom Server unterstützte Dokumentgröße (16 MB) beschränkt.

    • Unterstützt nicht so viele Ausgabeoptionen wie MapReduce

    • Beschränkt auf Operatoren und Ausdrücke, die vom Aggregation Framework unterstützt werden (d. h. es können keine benutzerdefinierten Funktionen geschrieben werden)

    • Neueste Serverfunktion für die Aggregation, daher mehr Raum für Weiterentwicklung in Bezug auf Dokumentation, Funktionsumfang und Nutzung.

  • Siehe auch:Aggregation Framework-Beispiele .

Kann mir jemand eine Illustration zeigen oder mich zu einem Link führen, wo diese drei Konzepte zusammen erklärt werden, wobei dieselben Beispieldaten verwendet werden, damit ich sie leicht vergleichen kann?

Im Allgemeinen werden Sie keine Beispiele finden, bei denen es sinnvoll wäre, alle drei Ansätze zu vergleichen, aber hier sind frühere StackOverflow-Fragen, die Variationen zeigen:

  • group() versus Aggregation Framework
  • MapReduce versus Aggregation Framework