In MongoDB der cursor.sort()
-Methode gibt die Reihenfolge an, in der die Abfrage übereinstimmende Dokumente zurückgibt.
Die sort()
-Methode akzeptiert ein Dokument, das das zu sortierende Feld und die Sortierreihenfolge angibt. Die Sortierreihenfolge kann entweder 1
sein für aufsteigend oder -1
zum absteigen.
Sie können auch { $meta: "textScore" }
angeben beim Ausführen von $text
Suchen, um nach dem berechneten textScore
zu sortieren Metadaten in absteigender Reihenfolge.
Beispieldaten
Angenommen, wir haben eine Sammlung namens pets
mit folgenden Dokumenten:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 5, "name" : "Bruce", "type" : "Kangaroo", "weight" : 100 } { "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 } { "_id" : 7, "name" : "Punch", "type" : "Kangaroo", "weight" : 200 } { "_id" : 8, "name" : "Snap", "type" : "Cat", "weight" : 12 } { "_id" : 9, "name" : "Ruff", "type" : "Dog", "weight" : 30 }
In aufsteigender Reihenfolge sortieren
Um in aufsteigender Reihenfolge zu sortieren, verwenden wir 1
für die Sortierreihenfolge.
Unten sehen Sie ein Beispiel für eine Abfrage, die $sort
verwendet -Operator, um diese Sammlung nach dem weight
zu sortieren Feld in aufsteigender Reihenfolge.
db.pets.find().sort({ weight: 1 })
Ergebnis:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 8, "name" : "Snap", "type" : "Cat", "weight" : 12 } { "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 9, "name" : "Ruff", "type" : "Dog", "weight" : 30 } { "_id" : 5, "name" : "Bruce", "type" : "Kangaroo", "weight" : 100 } { "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 } { "_id" : 7, "name" : "Punch", "type" : "Kangaroo", "weight" : 200 }
In absteigender Reihenfolge sortieren
Um in absteigender Reihenfolge zu sortieren, verwenden wir -1
für die Sortierreihenfolge.
db.pets.find().sort({ weight: -1 })
Ergebnis:
{ "_id" : 7, "name" : "Punch", "type" : "Kangaroo", "weight" : 200 } { "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 } { "_id" : 5, "name" : "Bruce", "type" : "Kangaroo", "weight" : 100 } { "_id" : 9, "name" : "Ruff", "type" : "Dog", "weight" : 30 } { "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 8, "name" : "Snap", "type" : "Cat", "weight" : 12 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
Nach mehreren Feldern sortieren
Um nach mehr als einem Feld zu sortieren, trennen Sie jede Feld/Sortierreihenfolge-Kombination durch ein Komma.
Beispiel
db.pets.find().sort({ type: 1, weight: -1, _id: 1 })
Ergebnis:
{ "_id" : 8, "name" : "Snap", "type" : "Cat", "weight" : 12 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 9, "name" : "Ruff", "type" : "Dog", "weight" : 30 } { "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 7, "name" : "Punch", "type" : "Kangaroo", "weight" : 200 } { "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 } { "_id" : 5, "name" : "Bruce", "type" : "Kangaroo", "weight" : 100 }
In diesem Beispiel haben wir nach type
sortiert zuerst in aufsteigender Reihenfolge, dann nach weight
Feld in absteigender Reihenfolge, dann nach _id
Feld in aufsteigender Reihenfolge.
Das bedeutet, wenn es mehrere Haustiere des gleichen Typs gibt, werden diese Haustiere nach ihrem weight
sortiert in absteigender Reihenfolge. Wenn es mehrere Haustiere mit demselben Typ und Gewicht gibt, werden diese Haustiere nach der _id
sortiert Feld in aufsteigender Reihenfolge. Wenn wir die _id
nicht eingefügt hätten Feld im Sortierprozess, dann könnten diese Haustiere der gleichen Art und des gleichen Gewichts in beliebiger Reihenfolge erscheinen. Dies gilt jedes Mal, wenn wir die Abfrage ausführen. Ohne ein Sortierfeld für ein eindeutiges Feld (wie die _id
Feld), wäre es durchaus möglich (sogar wahrscheinlich), dass die Ergebnisse jedes Mal, wenn die Abfrage ausgeführt wird, in einer anderen Reihenfolge zurückgegeben würden.
Verschiedene Typen sortieren
Beim Vergleichen von Werten verschiedener BSON-Typen verwendet MongoDB die folgende Vergleichsreihenfolge, vom niedrigsten zum höchsten:
- MinKey (interner Typ)
- Null
- Zahlen (ints, longs, doubles, decimals)
- Symbol, Zeichenfolge
- Objekt
- Array
- BinData
- Objekt-ID
- Boolesch
- Datum
- Zeitstempel
- Regulärer Ausdruck
- MaxKey (interner Typ)
Angenommen, wir haben eine Sammlung namens Posts mit den folgenden Dokumenten:
{ "_id" : 1, "title" : "Web", "body" : "Create a funny website with these three easy steps...", "date" : "2021-01-01T00:00:00.000Z" } { "_id" : 2, "title" : "Animals", "body" : "Animals are funny things...", "date" : ISODate("2020-01-01T00:00:00Z") } { "_id" : 3, "title" : "Oceans", "body" : "Oceans are wide and vast, but definitely not funny...", "date" : ISODate("2021-01-01T00:00:00Z") }
Beachten Sie, dass das erste date
Das Feld enthält eine Datumszeichenfolge, während die anderen beiden Dokumente ein Datumsobjekt verwenden.
Beachten Sie auch, dass die Datumszeichenfolge genau das gleiche Datum wie Dokument 3 enthält und dieses Datum ein späteres Datum als das Datum in Dokument 2 ist.
Lassen Sie uns nach dem date
sortieren Felder dieser Dokumente:
db.posts.find().sort({ date: 1 }).pretty()
Ergebnis:
{ "_id" : 1, "title" : "Web", "body" : "Create a funny website with these three easy steps...", "date" : "2021-01-01T00:00:00.000Z" } { "_id" : 2, "title" : "Animals", "body" : "Animals are funny things...", "date" : ISODate("2020-01-01T00:00:00Z") } { "_id" : 3, "title" : "Oceans", "body" : "Oceans are wide and vast, but definitely not funny...", "date" : ISODate("2021-01-01T00:00:00Z") }
In diesem Fall haben wir in aufsteigender Reihenfolge sortiert, was bedeutet, dass frühere Daten zuerst kommen sollten. Unser erstes Dokument enthält jedoch eine Datumszeichenfolge anstelle eines Datumsobjekts, und daher kam es zuerst – obwohl sein Datum später als das Datum in Dokument 2 ist.
Hier noch einmal, aber in absteigender Reihenfolge:
db.posts.find().sort({ date: -1 }).pretty()
Ergebnis:
{ "_id" : 3, "title" : "Oceans", "body" : "Oceans are wide and vast, but definitely not funny...", "date" : ISODate("2021-01-01T00:00:00Z") } { "_id" : 2, "title" : "Animals", "body" : "Animals are funny things...", "date" : ISODate("2020-01-01T00:00:00Z") } { "_id" : 1, "title" : "Web", "body" : "Create a funny website with these three easy steps...", "date" : "2021-01-01T00:00:00.000Z" }
Auch hier sind die verschiedenen Datentypen separat in sich geordnet.
Text Score Metadata Sort
Sie können den { $meta: "textScore" }
verwenden Argument zum Sortieren nach absteigender Relevanzbewertung bei Verwendung von $text
Suchen.
Beispiel
db.posts.find(
{ $text: { $search: "funny" } },
{ score: { $meta: "textScore" }}
).sort({ score: { $meta: "textScore" } }
).pretty()
Ergebnis:
{ "_id" : 2, "title" : "Animals", "body" : "Animals are funny things...", "date" : ISODate("2020-01-01T00:00:00Z"), "score" : 0.6666666666666666 } { "_id" : 3, "title" : "Oceans", "body" : "Oceans are wide and vast, but definitely not funny...", "date" : ISODate("2021-01-01T00:00:00Z"), "score" : 0.6 } { "_id" : 1, "title" : "Web", "body" : "Create a funny website with these three easy steps...", "date" : "2021-01-01T00:00:00.000Z", "score" : 0.5833333333333334 }
In diesem Beispiel haben wir nach { $meta: "textScore" }
sortiert .
Ab MongoDB 4.4 die Zeile mit { score: { $meta: "textScore" }}
es ist optional. Wenn Sie dies weglassen, wird die score
weggelassen Feld aus den Ergebnissen. Daher können wir Folgendes tun (ab MongoDB 4.4):
db.posts.find(
{ $text: { $search: "funny" } }
).sort({ score: { $meta: "textScore" } }
).pretty()
Ergebnis:
{ "_id" : 2, "title" : "Animals", "body" : "Animals are funny things...", "date" : ISODate("2020-01-01T00:00:00Z") } { "_id" : 3, "title" : "Oceans", "body" : "Oceans are wide and vast, but definitely not funny...", "date" : ISODate("2021-01-01T00:00:00Z") } { "_id" : 1, "title" : "Web", "body" : "Create a funny website with these three easy steps...", "date" : "2021-01-01T00:00:00.000Z" }
$text
ausführen Suchen wie diese erfordern, dass wir einen Textindex erstellt haben. Wenn nicht, ein IndexNotFound
Fehler wird zurückgegeben.
Weitere Informationen
Weitere Informationen finden Sie in der MongoDB-Dokumentation.