Was ist die Standardsortierreihenfolge, wenn keine angegeben ist?
Die standardmäßige interne Sortierreihenfolge (oder natürliche Reihenfolge ) ist ein undefiniertes Implementierungsdetail. Aufrechterhaltung der Ordnung ist zusätzliche Aufwand für Speicher - Engines und MongoDB API nicht Vorhersagbarkeit außerhalb eines ausdrücklichen Auftrag sort()
oder den Sonderfall fester Größe mit einer Kappe bedeckt Sammlungen , die verknüpft sind Nutzungsbeschränkungen . Für typische Workloads ist es wünschenswert, dass die Speicher-Engine versucht, den verfügbaren vorab zugewiesenen Speicherplatz wiederzuverwenden und Entscheidungen darüber zu treffen, wie Daten am effizientesten auf der Festplatte und im Speicher gespeichert werden.
Ohne Abfragekriterien werden die Ergebnisse von der Speicher-Engine in natürlicher Reihenfolge (auch bekannt als in der Reihenfolge, in der sie gefunden wurden ) zurückgegeben. Die Ergebnisreihenfolge kann mit der Einfügereihenfolge übereinstimmen, dieses Verhalten ist jedoch nicht garantiert und kann nicht verwendet werden (abgesehen von begrenzten Sammlungen).
Einige Beispiele, die die (natürliche) Speicherreihenfolge beeinflussen können:
- WiredTiger verwendet eine andere Darstellung von Dokumenten auf der Festplatte als der speicherinterne Cache, sodass sich die natürliche Reihenfolge aufgrund interner Datenstrukturen ändern kann.
- Die ursprüngliche MMAPv1-Speicher-Engine (in MongoDB 4.2 entfernt) weist Datensatzspeicherplatz für Dokumente basierend auf Auffüllregeln zu. Wenn ein Dokument über den aktuell zugewiesenen Datensatzbereich hinauswächst, wird der Dokumentspeicherort (und die natürliche Reihenfolge) beeinflusst. Neue Dokumente können auch in den Speicher eingefügt werden, der aufgrund gelöschter oder verschobener Dokumente als zur Wiederverwendung verfügbar markiert ist.
- Die Replikation verwendet ein idempotentes Oplog- Format, um Schreibvorgänge konsistent auf Replikatsatzmitglieder anzuwenden. Jedes Replikatsatzmitglied verwaltet lokale Datendateien, die in natürlicher Reihenfolge variieren können, aber das gleiche Datenergebnis haben, wenn Oplog-Updates angewendet werden.
Was ist, wenn ein Index verwendet wird?
Wenn ein Index verwendet wird, werden Dokumente in der Reihenfolge zurückgegeben, in der sie gefunden wurden (was notwendigerweise der Einfügereihenfolge oder der E / A-Reihenfolge entspricht). Wenn mehr als ein Index verwendet wird, hängt die Reihenfolge intern davon ab, welcher Index das Dokument während des Deduplizierungsprozesses zuerst identifiziert hat.
Wenn Sie eine vorhersagbare Sortierreihenfolge Sie müssen eine explizite sind sort()
mit Ihrer Anfrage und haben eindeutige Werte für die Sortierschlüssel.
Wie behalten begrenzte Sammlungen die Einfügereihenfolge bei?
Die Implementierungsausnahme, die für die natürliche Reihenfolge in mit einer Kappe versehenen Sammlungen angegeben ist, wird durch ihre besonderen Verwendungsbeschränkungen erzwungen: Dokumente werden in der Einfügereihenfolge gespeichert, die vorhandene Dokumentgröße kann jedoch nicht erhöht und Dokumente können nicht explizit gelöscht werden. Die Bestellung ist Teil des gekappten Sammlungsdesigns, das sicherstellt, dass die ältesten Dokumente zuerst "altern".
{createdAt: -1}
) ist erforderlich, um optimistische Benutzeroberflächenmuster zu implementieren (Aktualisieren von Datenlisten im Cache, ohne auf die Serverantwort nach einem Erstellen / Aktualisieren / Löschen zu warten). Andernfalls können Sie die clientseitige optimistische Reihenfolge und die Serverantwortreihenfolge nicht abgleichen.Es wird in der gespeicherten Reihenfolge (Reihenfolge in der Datei) zurückgegeben, es kann jedoch nicht garantiert werden, dass sie in der eingefügten Reihenfolge vorliegen. Sie sind nicht nach dem Feld _id sortiert. Manchmal kann es so aussehen, als wäre es nach der Einfügereihenfolge sortiert, aber es kann sich in einer anderen Anfrage ändern. Es ist nicht zuverlässig.
quelle