Wie man MongoDB $unwind

Wie man MongoDB $unwind

  • Orchestrierung
6 Minuten Lesezeit Aktualisiert Dec 2, 2020

Auf einen Blick: MongoDB $unwind ist ein Operator, der Array-Felder in Dokumenten dekonstruiert und für jedes Array-Element separate Ausgabedokumente erstellt, um die Lesbarkeit der Daten zu verbessern und Operationen wie Gruppieren und Sortieren zu erleichtern.

  • $unwind vereinfacht komplexe Dokumente in einzelne Einträge.
  • Es verarbeitet seit MongoDB 3.2 Nicht-Array-Felder als Einzelelement-Arrays.

MongoDB $unwind ist ein nützliches Werkzeug zur Durchführung der Aggregation in MongoDB. Schauen wir uns $unwind an und wie man es verwendet.

Was ist MongoDB $unwind?

Der MongoDB $unwind-Operator wird verwendet, um ein Array-Feld in einem Dokument zu dekonstruieren und für jedes Element im Array separate Ausgabedokumente zu erstellen. Der einzige Unterschied zwischen dem Eingabedokument und den Ausgabedokumenten besteht darin, dass in Ausgabedokumenten der Wert des Array-Feldes durch ein einzelnes Element aus dem Eingabedokument-Array ersetzt wird. Das werden Sie sehen, wenn ich Sie durch dieses Beispiel führe. MongoDB $unwind verwandelt komplexe Dokumente in einfachere Dokumente, die die Lesbarkeit und das Verständnis erhöhen. Dies ermöglicht uns auch, zusätzliche Operationen durchzuführen, wie das Gruppieren und Sortieren der resultierenden Ausgabe.

Die grundlegende Syntax $unwind Operators

    { $unwind: "$" }
    {$unwind: { path : "$", }}

Hier sollten Sie den Pfad mit dem Dollarzeichen "$" voranstellen, um eine erfolgreiche $unwind-Operation zu gewährleisten. Als Nächstes demonstrieren wir eine einfache $unwind-Operation mit unserer "vehicledetails"-Sammlung. Zuerst schauen wir uns unsere Sammlung an.

    db.vehicledetails.find().pretty()

Ergebnis:

Als Nächstes verwenden wir den $unwind-Operator, um das Array-Feld "model_year" zu dekonstruieren und für jedes Jahr separate Dokumente zu erstellen.

    db.vehicledetails.aggregate([{$unwind : "$model_year" }]).pretty()

Ergebnis:

Wie in der obigen Ausgabe gezeigt, wird für jedes Element im "model_year"-Array ein neues Dokument erstellt.

Wie funktioniert $unwind mit Nicht-Array-Feldpfaden

Vor MongoDB 3.2 hätte ein Nicht-Array-Feld als Pfad im $unwind-Operator definiert einen Fehler verursacht. Ab MongoDB 3.2 wird jedes Nicht-Array-Feld, das sich nicht auf ein fehlendes, nulles oder leeres Array auflösen lässt, als Einzel-Element-Array behandelt. Das nächste Beispiel zeigt, wie der $unwind-Operator ein Array mit einem einzelnen Element handhabt.

    db.vehicledetails.aggregate([{$unwind : "$make" }]).pretty()

Ergebnis:

Hier erstellt die $unwind-Operation erfolgreich ein einziges Ausgabedokument, da sie das "make"-Feld als ein einzelnes Item-Array betrachtet.

Fehlender Körper als Pfad

Der $unwind-Operator erzeugt keine Ausgabe, wenn der angegebene Pfad ein fehlendes oder nicht verfügbares Feld ist. Es gibt keinen Fehler, da der $unwind das Eingabedokument ignoriert.

    db.vehicledetails.aggregate([{$unwind : "$use" }]).pretty()

Ergebnis:

In der obigen Operation ist der bereitgestellte Pfad für den $unwind-Operator das "use"-Feld. Das Eingabedokument wird jedoch ignoriert, da es kein "use"-Feld im Eingabedokument gibt.

$unwind Operator-Optionen

Der $unwind-Operator kann mit zwei optionalen Argumenten verwendet werden, nämlich includeArrayIndex und preserveNullAndEmptyArrays. Dieser Abschnitt zeigt, wie jede Option das Ergebnis einer $unwind-Operation beeinflusst. Wieder verwenden wir die Sammlung "vehicledetails" mit zusätzlichen Dokumenten, um die Funktionalität der optionalen Argumente zu demonstrieren.

    db.vehicledetails.find().pretty()

Ergebnis:

Wenn Sie $unwind Operation auf dem obigen Datensatz mit dem "model_year"-Feld ausführen, besteht das Ergebnis aus fünf Ergebnissen. Sehen wir uns das in diesem Beispiel an:

    db.vehicledetails.aggregate([{$unwind : "$model_year" }]).pretty()

Ergebnis:

includeArrayIndex-Option

Die Option includeArrayIndex wird verwendet, um den Array-Index mit der Ausgabe der $unwind Operation zu erhalten. Wir können ein Feld in der "includeArrayIndex"-Syntax definieren, um den Array-Index jedes Ausgabedokuments zu erhalten. Wenn das Array-Feld null ist, ergibt sich im benutzerdefinierten Feld ein Nullwert, und wenn ein leeres Array vorhanden ist, wird es ignoriert, da sich in diesem Array keine Elemente befinden. Im untenstehenden Beispiel wird das Feld "model_year" verwendet, um die $unwind-Operation auszuführen, und das benutzerdefinierte Feld "vehicleIndex" wird verwendet, um den Array-Index abzufangen.

    db.vehicledetails.aggregate([{$unwind : {path: "$model_year", includeArrayIndex: "vehicleIndex" }}]).pretty()

Ergebnis:

preserveNullAndEmptyArrays-Option

Die Definition der Option "preserveNullAndEmptyArrays" in einer $unwind-Operation ermöglicht es dem Benutzer, Dokumente einzufügen, bei denen das Array-Feld fehlt, null oder leer ist. Die Option "preserveNullAndEmptyArrays" nimmt nur boolesche Argumente wie true oder false. Verwenden wir die Dokumente in der "vehicledetails"-Sammlung, um die Option "preserveNullAndEmptyArrays" zu demonstrieren. Dies führt zu einer Ausgabe, in der alle fehlenden, nullen oder leeren Arrays im Feld "model_year" erfasst werden.

    db.vehicledetails.aggregate([{$unwind : {path: "$model_year", preserveNullAndEmptyArrays: true}}]).pretty()

Ergebnis:

Datengruppierung nach Unwound-Werten

In MongoDB können Sie den resultierenden Datensatz einer $unwind Operation – unwound values – verwenden, um den Datensatz weiter zu transformieren. Die Sammlung "vehiclesalesmain" wird verwendet, um zu demonstrieren, wie $unwind Operator mit anderen Funktionen kombiniert werden kann.

    db.vehiclesalesmain.find().pretty()

Ergebnis:

Im nächsten Abschnitt wird das "Farben"-Array verwendet, um die $unwind Operation durchzuführen. Wir verwenden außerdem MongoDB-Gruppen- und Sortiermethoden, um den Durchschnittspreis entsprechend den Fahrzeugfarben zu erhalten.

    db.vehiclesalesmain.aggregate([{$unwind: {path: "$colours", preserveNullAndEmptyArrays: true}}, {$group: { _id: "$colours", averagePrice: {$avg: "$price"}}},{$sort: {"averagePrice": -1}}])

Ergebnis:

Lassen Sie uns die obige Formel in mehreren Schritten vereinfachen, um den Prozess besser zu verstehen. Die vollständige formatierte Syntax sehen Sie unten.

    db.vehiclesalesmain.aggregate([
{
$unwind: {
path: "$colours",
preserveNullAndEmptyArrays: true
}
},
{
$group: {
_id: "$colours",
averagePrice: {
$avg: "$price"
}
}
},
{
$sort: {
"averagePrice": -1
}
}
])

Schritt 1

Im ersten Schritt werden die Dokumente in der Sammlung "vehiclesalesmain" mit dem Feld "colours" abwickt. Anschließend wird das preserveNullAndEmptyArrays auf true gesetzt, um alle fehlenden, nullen oder leeren Arrays im resultierenden Output zu erfassen.

    db.vehiclesalesmain.aggregate([{$unwind: {path: "$colours", preserveNullAndEmptyArrays: true}}]).pretty()

Ergebnis:

Schritt 2

Im zweiten Schritt werden Dokumente, die aus der $unwind-Operation resultieren, nach der MongoDB-Gruppenmethode unter Verwendung der Farbe gruppiert, und der Durchschnittspreis für jede Farbe wird berechnet. Gruppierungssyntax:

    {$group: { _id: "$colours", averagePrice: {$avg: "$price"}}}

Vollständige Syntax:

    db.vehiclesalesmain.aggregate([{$unwind: {path: "$colours", preserveNullAndEmptyArrays: true}}, {$group: { _id: "$colours", averagePrice: {$avg: "$price"}}}])

Ergebnis:

Schritt 3

Schließlich wird der gruppierte Datensatz in absteigender Reihenfolge mit der MongoDB-Sortiermethode sortiert. Sortiersyntax:

    {$sort: {"averagePrice": -1}}])

Vollständige Syntax:

    db.vehiclesalesmain.aggregate([{$unwind: {path: "$colours", preserveNullAndEmptyArrays: true}}, {$group: { _id: "$colours", averagePrice: {$avg: "$price"}}},{$sort: {"averagePrice": -1}}])

Ergebnis:

Verwendung von $unwind auf eingebetteten Arrays

Wenn Sie die $unwind-Operation auf einem eingebetteten Array ausführen, funktioniert es genauso wie bei einem normalen Array-Feld. Die $unwind-Operation dekonstruiert die Elemente in jedem der eingebetteten Arrays. Mit der "vehicleitems"-Sammlung zeigen wir, wie der $unwind-Operator auf einem eingebetteten Array funktioniert. Schauen wir uns die "vehicleitems"-Sammlung an.

    db.vehicleitems.find().pretty()

Ergebnis:

Im nächsten Abschnitt wird die $unwind-Operation auf den oben genannten Dokumenten unter Verwendung der eingebetteten Arrays "Items" durchgeführt.

    db.vehicleitems.aggregate({$unwind: "$items"}).pretty()

Ergebnis:

Wie Sie in den Ausgabedokumenten sehen können, wird jedes Element in allen eingebetteten "Items"-Arrays als einzelne Elemente dekonstruiert. Sie können den resultierenden Datensatz weiter mit dem "Typ"-Array dekonstruieren, was wir im nächsten Beispiel tun. Dekonstruktionssyntax:

    {$unwind: "$items"},{$unwind: "$items.type"}

Vollständige Syntax:

    db.vehicleitems.aggregate([{$unwind: "$items"},{$unwind: "$items.type"},{$project: { _id: 0}}])

Verwenden Sie den Projektionsoperator, um das Feld "objectId" zu entfernen, um eine sauberere Ausgabe zu erhalten. Ergebnis:

Das ist das Ende dieses MongoDB-$unwind-Tutorials.

Verwandte Literatur

Diese Beiträge sind meine eigenen und spiegeln nicht unbedingt die Position, Strategien oder Meinung von BMC wider.

Mehr aus Orchestrierung

Interessieren Sie sich für mehr von BMC?

The Brief ist unsere monatliche E-Mail zum Mainframe und zur Enterprise-Orchestrierung: Recherchen, Kundenberichte, Produktnachrichten, Events.

Mit der Registrierung für dieses Angebot bestätigen Sie, dass Sie die Datenschutzrichtlinie von BMC gelesen und zugestimmt haben.

Sie haben The Brief abonniert

Das Briefing umfasst die Mainframe- und Enterprise-Orchestrierung – BMC AMI und Control-M – sowie die Analystenforschung, Kundeneinsätze und Events in beiden Bereichen.