Willkommen bei MongoDB!
Die Sache, an die Sie sich erinnern sollten, ist, dass MongoDB einen "NoSQL" -Ansatz für die Datenspeicherung verwendet, sodass Sie die Gedanken an Auswahlen, Verknüpfungen usw. aus Ihrem Kopf verlieren. Die Art und Weise, wie Ihre Daten gespeichert werden, erfolgt in Form von Dokumenten und Sammlungen, die ein dynamisches Mittel zum Hinzufügen und Abrufen der Daten von Ihren Speicherorten ermöglichen.
Um das Konzept hinter dem Parameter $ unwind zu verstehen, müssen Sie zunächst verstehen, was der Anwendungsfall, den Sie zitieren möchten, aussagt. Das Beispieldokument von mongodb.org lautet wie folgt:
{
title : "this is my title" ,
author : "bob" ,
posted : new Date () ,
pageViews : 5 ,
tags : [ "fun" , "good" , "fun" ] ,
comments : [
{ author :"joe" , text : "this is cool" } ,
{ author :"sam" , text : "this is bad" }
],
other : { foo : 5 }
}
Beachten Sie, dass Tags tatsächlich ein Array von 3 Elementen sind, in diesem Fall "Spaß", "Gut" und "Spaß".
Mit $ unwind können Sie für jedes Element ein Dokument abziehen und das resultierende Dokument zurückgeben. Um dies in einem klassischen Ansatz zu betrachten, wäre es gleichbedeutend mit "für jedes Element im Tags-Array ein Dokument mit nur diesem Element zurückgeben".
Somit ergibt sich folgendes Ergebnis:
db.article.aggregate(
{ $project : {
author : 1 ,
title : 1 ,
tags : 1
}},
{ $unwind : "$tags" }
);
würde die folgenden Dokumente zurückgeben:
{
"result" : [
{
"_id" : ObjectId("4e6e4ef557b77501a49233f6"),
"title" : "this is my title",
"author" : "bob",
"tags" : "fun"
},
{
"_id" : ObjectId("4e6e4ef557b77501a49233f6"),
"title" : "this is my title",
"author" : "bob",
"tags" : "good"
},
{
"_id" : ObjectId("4e6e4ef557b77501a49233f6"),
"title" : "this is my title",
"author" : "bob",
"tags" : "fun"
}
],
"OK" : 1
}
Beachten Sie, dass sich im Ergebnisarray nur ändert, was im Tag-Wert zurückgegeben wird. Wenn Sie eine zusätzliche Referenz dazu benötigen, habe ich hier einen Link eingefügt . Hoffentlich hilft das und viel Glück bei Ihrem Streifzug durch eines der besten NoSQL-Systeme, die mir bisher begegnet sind.
Gemäß der offiziellen Dokumentation von Mongodb:
$ unwind Dekonstruiert ein Array-Feld aus den Eingabedokumenten, um für jedes Element ein Dokument auszugeben. Jedes Ausgabedokument ist das Eingabedokument, wobei der Wert des Arrayfelds durch das Element ersetzt wird.
Erklärung anhand eines einfachen Beispiels:
Ein Sammlungsinventar enthält die folgenden Dokumente:
Die folgenden $ Abroll - Operationen sind gleichwertig und ein Dokument für jedes Element in dem Rück Größen Feld. Wenn das Größenfeld nicht in ein Array aufgelöst wird, aber nicht fehlt, null oder ein leeres Array, behandelt $ unwind den Nicht-Array-Operanden als ein einzelnes Elementarray.
oder
Über der Abfrageausgabe:
Warum wird es benötigt?
$ unwind ist sehr nützlich, wenn Sie eine Aggregation durchführen. Es zerlegt komplexe / verschachtelte Dokumente in einfache Dokumente, bevor verschiedene Vorgänge wie Sortieren, Suchen usw. ausgeführt werden.
Um mehr über $ unwind zu erfahren:
https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/
Um mehr über die Aggregation zu erfahren:
https://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/
quelle
Betrachten Sie das folgende Beispiel, um diese Daten in einer Sammlung zu verstehen
Abfrage - db.test1.aggregate ([{$ unwind: "$ size"}]);
Ausgabe
quelle
Lassen Sie mich auf eine Weise erklären, die mit der RDBMS-Art korreliert. Dies ist die Aussage:
auf das Dokument / den Datensatz anwenden :
Das $ project / Select gibt einfach diese Felder / Spalten als zurück
Als nächstes folgt der unterhaltsame Teil von Mongo. Betrachten Sie dieses Array
tags : [ "fun" , "good" , "fun" ]
als eine andere verwandte Tabelle (kann keine Nachschlagetabelle / Referenztabelle sein, da Werte einige Duplikate aufweisen) mit dem Namen "tags". Denken Sie daran, dass SELECT im Allgemeinen vertikale Elemente erzeugt. Wenn Sie also die "Tags" abwickeln, teilen Sie () vertikal in "Tags" der Tabelle auf.Das Endergebnis von $ project + $ unwind:
Übersetzen Sie die Ausgabe in JSON:
Da wir Mongo nicht angewiesen haben, das Feld "_id" wegzulassen, wird es automatisch hinzugefügt.
quelle