Wie funktioniert das Sortieren mit einem Index in MongoDB?

Ich frage mich, wie das Sortieren mit einem Index in MongoDB tatsächlich funktioniert. Es gibt einPaa Artike in der MongoDB-Dokumentation, aber sie beschreiben nicht wirklich, wie die Sortierung abläuft oder wie komplex die Zeit ist. Durchsuchungen von SO und des Internet im Allgemeinen haben bisher nichts Relevantes ergeben.

Nehmen wir an, es gibtaei @ -Dokumenten in einer Sammlung stimmt die find () -Klausel mit @ übereib Dokumente, es gibt ein Limit vonc Dokumente zurückgegeben,a >>b >>c, undc ist eine ausreichend große Zahl, sodass der zurückgegebene Satz nicht in den Speicher passt - beispielsweise 1 Million Dokumente.

u Beginn der Operation gibt esb zu sortierende Dokumente und sortierter Baumindex der Größea für die Funktion werden die Dokumente sortiert nach.

Ich kann mir vorstellen

A) Durchlaufen Sie den Index in der angegebenen Reihenfolge, und durchlaufen Sie für jede ObjectID die Liste vonb Dokumente. Spiele zurück bisc ist erreicht. Dies wäre O ab).

B) wie A), aber erstelle ein Hashset der ObjectIDs imb Dokumente zuerst. Das ist O a), nimmt aber O b) Erinnerung

Ich habe versucht, Sortierungen zu berücksichtigen, die auf dem Durchlaufen der Menge von @ basiereb Dokumente, aber nichts schneller als O b logb), was nicht besser ist als ohne Index zu sortieren.

Ich nehme an (aber vielleicht irre ich mich), dass für jede Sortierung kein Index-Scan erforderlich ist. Wie funktioniert die Sortierung also tatsächlich?

Aktualisieren

Kevins Antwort und der bereitgestellte Link schränken die Frage stark ein, aber ich möchte ein paar Punkte bestätigen / klarstellen:

Soweit ich weiß, können Sie für die Abfrage und die Sortierung keine unterschiedlichen Indizes verwenden, wenn Sie eine speicherinterne Sortierung vermeiden möchten. Wenn ich lesediese Seit es schien, als könntest du es (oder zumindest, es hat nicht die eine oder andere Art spezifiziert), aber das scheint falsch zu sein. Im Wesentlichen werden die Dokumente sortiert, da sie während der Abfrage in der Reihenfolge des Index nachgeschlagen und daher in der Reihenfolge des Index zurückgegeben werden. RichtigBei der Abfrage eines zusammengesetzten Index wird der Sortierindex muss der erste Index im zusammengesetzten Index sein, außer für Indizes, bei denen die Abfrage eine Gleichheit ist. Wenn nicht, wird die Sortierung im Speicher durchgeführt. Richtig

Wie funktioniert das Sortieren mit$in oder$or Abfragen? Angenommen, die Abfrage lautet

{a: {$in: [4, 6, 2, 1, 3, 10]}, b: {$gt: 1, $lt: 6}}

... und es gibt einen zusammengesetzten Index füra undb in dieser Reihenfolge. Wie würde die Sortierung in den Fällen funktionieren, in denen die Sortierung auf @ isa oderb? $or ist noch komplizierter, da, wie ich es verstehe,$or -Abfragen werden im Wesentlichen in mehrere separate Abfragen aufgeteilt. Sind$or Abfragen immer eine speicherinterne Sortierung, zumindest zum Zusammenführen der Ergebnisse der einzelnen Abfragen?