webentwicklung-frage-antwort-db.com.de

Wie bestellt MongoDB ihre Dokumente in einer Sammlung?

In meiner User collection ordnet MongoDB normalerweise jedes neue Dokument in der gleichen Reihenfolge an, in der ich es erstelle. Das letzte erstellte ist das letzte in der Sammlung. Ich habe jedoch eine andere Sammlung entdeckt, bei der die letzte, die ich erstellt habe, die Position 6 zwischen 27 Dokumenten hat. 

Warum das?

Welche Reihenfolge folgt jedem Dokument in der MongoDB-Sammlung?

16
Paola G

Es heißt natürliche Reihenfolge :

natural order

Die Reihenfolge, in der die Datenbank auf Dokumente auf der Festplatte verweist. Dies ist die Standardsortierreihenfolge. Siehe $natural und Return in Natural Order .

Dies bestätigt, dass Sie sie im Allgemeinen in der Reihenfolge erhalten, in der Sie sie eingefügt haben, dies ist jedoch nicht garantiert - wie Sie bemerkt haben.

Rückgabe in natürlicher Reihenfolge

Der Parameter $natural gibt Elemente gemäß ihrer natürlichen Reihenfolge in der Datenbank zurück. Diese Reihenfolge ist eine interne Implementierungsfunktion, und Sie sollten sich nicht auf eine bestimmte Struktur darin verlassen.

Indexverwendung

Abfragen, die eine Sortierung nach $natural Reihenfolge enthalten, verwenden keine Indizes, um das Abfrageprädikat zu erfüllen, mit der folgenden Ausnahme: Wenn das Abfrageprädikat ein ist Gleichheitsbedingung für das Feld _id{ _id: <value> }, dann kann die Abfrage mit der Sortierung nach $natural Reihenfolge den Index _id verwenden.

MMAPv1

In der Regel entspricht die natürliche Reihenfolge der Einfügereihenfolge mit der folgenden Ausnahme für die MMAPv1-Speicher-Engine. Bei der MMAPv1-Speicher-Engine spiegelt die natürliche Reihenfolge nicht die Einfügereihenfolge wider, wenn die Dokumente aufgrund von Dokumentenwachstum verschoben werden oder Operationen freien Speicherplatz entfernen, der dann von neu eingefügten Dokumenten belegt wird.

Wie in den genannten Dokumenten erwähnt, sollten Sie sich nicht auf diese Standardreihenfolge verlassen ( Diese Reihenfolge ist eine interne Implementierungsfunktion, und Sie sollten sich nicht auf eine bestimmte Struktur darin verlassen. ).

Wenn Sie die Dinge sortieren müssen, verwenden Sie die Sortierlösungen .


Grundsätzlich sollten die folgenden zwei Aufrufe Dokumente in derselben Reihenfolge zurückgeben (da die Standardreihenfolge $natural Ist):

db.mycollection.find().sort({ "$natural": 1 })
db.mycollection.find()

Wenn Sie nach einem anderen Feld sortieren möchten (z. B. name), können Sie dies tun:

db.mycollection.find().sort({ "name": 1 })
22
Ionică Bizău

Ich konnte mehr über den Link Return in Natural Order erfahren durch Ionică Bizău herausfinden. 

"Der $ natural-Parameter gibt Elemente gemäß ihrer natürlichen Reihenfolge in der Datenbank zurück .Diese Reihenfolge ist eine interne Implementierungsfunktion, und Sie sollten sich nicht auf eine bestimmte Struktur in der Datenbank verlassen.

Normalerweise spiegelt die natürliche Reihenfolge die Einfügereihenfolge mit der folgenden Ausnahme für die MMAPv1-Speicher-Engine wider. Bei der MMAPv1-Speicher-Engine spiegelt die natürliche Reihenfolge keine Einfügereihenfolge wider, wenn die Dokumente aufgrund von Dokumentzuwachs umziehen oder durch Löschvorgänge Speicherplatz freigeben, der dann von neu eingefügten Dokumenten belegt wird. "

2
Paola G

MongoDB "bestellt" die Dokumente überhaupt nicht, es sei denn, Sie verlangen es.

Die grundlegende Einfügung erstellt eine ObjectId im _id-Primärschlüsselwert, sofern Sie nichts anderes angeben. Dieser ObjectId-Wert ist ein spezieller Wert mit "monotonic" - oder "immer weiter steigenden" Eigenschaften, was bedeutet, dass jeder erzeugte Wert garantiert größer als der letzte ist.

Wenn Sie "sortieren" möchten, führen Sie eine explizite "Sortierung" aus:

 db.collection.find().sort({ "_id": 1 })

Oder eine "natürliche" Sortierung bedeutet in der Reihenfolge, die auf der Festplatte gespeichert ist:

db.collection.find().sort({ "$natural": 1 })

Dies ist so ziemlich der Standard, wenn nicht anders angegeben oder ein "Index" von den Abfragekriterien ausgewählt wird, die die Sortierreihenfolge bestimmen. Sie können dies jedoch verwenden, um diese Reihenfolge zu "erzwingen", wenn die Abfragekriterien einen Index auswählen, der anders sortiert ist.

MongoDB-Dokumente "verschieben" sich, wenn sie gewachsen sind. Daher ist die Reihenfolge von _id nicht immer explizit dieselbe Reihenfolge, in der Dokumente abgerufen werden.

2
Blakes Seven

Aus Leistungsgründen teilt MongoDB niemals ein Dokument auf der Festplatte.

Wenn Sie mit einer leeren Sammlung beginnen und mit dem Einfügen eines Dokuments beginnen, legt mongoDB diese nacheinander auf der Festplatte ab.

Aber was passiert, wenn Sie ein Dokument aktualisieren und es jetzt mehr Platz benötigt und nicht mehr in seine alte Position passt, ohne dass sich das nächste überlappt? In diesem Fall löscht MongoDB es und fügt es am Ende der Sammlungsdatei als neue an.

Ihre Sammlungsdatei hat jetzt eine Lücke ungenutzten Speicherplatzes. Das ist doch eine Verschwendung, nicht wahr? Deshalb wird das nächste Dokument, das eingefügt und klein genug, um in dieses Loch zu passen, in dieses Loch eingefügt. Das ist wahrscheinlich das, was bei Ihrer zweiten Sammlung passiert ist.

Fazit: Verlassen Sie sich niemals darauf, dass Dokumente in Einfügereihenfolge zurückgegeben werden. Wenn Sie sich um die Bestellung kümmern, sortieren Sie immer Ihre Ergebnisse.

1
Philipp