I MongoDB er cursor.sort()
metode angiver den rækkefølge, som forespørgslen returnerer matchende dokumenter i.
sort()
metoden accepterer et dokument, der specificerer det felt, der skal sorteres, og sorteringsrækkefølgen. Sorteringsrækkefølgen kan enten være 1
for stigende eller -1
til nedstigning.
Du kan også angive { $meta: "textScore" }
når du laver $text
søgninger for at sortere efter den beregnede textScore
metadata i faldende rækkefølge.
Eksempel på data
Antag, at vi har en samling kaldet pets
med følgende dokumenter:
{ "_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 }
Sortér i stigende rækkefølge
For at sortere i stigende rækkefølge bruger vi 1
for sorteringsrækkefølgen.
Nedenfor er et eksempel på en forespørgsel, der bruger $sort
operatør for at sortere denne samling efter weight
felt i stigende rækkefølge.
db.pets.find().sort({ weight: 1 })
Resultat:
{ "_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 }
Sortér i faldende rækkefølge
For at sortere i faldende rækkefølge bruger vi -1
for sorteringsrækkefølgen.
db.pets.find().sort({ weight: -1 })
Resultat:
{ "_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 }
Sortér efter flere felter
For at sortere efter mere end ét felt skal du adskille hvert felt/sorteringsrækkefølge med et komma.
Eksempel
db.pets.find().sort({ type: 1, weight: -1, _id: 1 })
Resultat:
{ "_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 }
I dette eksempel sorterede vi efter type
felt i stigende rækkefølge først, derefter efter weight
felt i faldende rækkefølge, derefter efter _id
felt i stigende rækkefølge.
Dette betyder, at hvis der er flere kæledyr af samme type, er disse kæledyr sorteret efter deres weight
i faldende rækkefølge. Hvis der er flere kæledyr med både samme type og vægt, sorteres disse kæledyr efter _id
felt i stigende rækkefølge. Hvis vi ikke havde inkluderet _id
felt i sorteringsprocessen, så kunne de kæledyr af samme type og vægt dukke op i vilkårlig rækkefølge. Dette er sandt, hver gang vi kører forespørgslen. Uden at have et sorteringsfelt på et unikt felt (såsom _id
). felt), ville det være fuldt ud muligt (endda sandsynligt), at resultaterne ville komme tilbage i en anden rækkefølge, hver gang forespørgslen blev kørt.
Sortering af forskellige typer
Når man sammenligner værdier af forskellige BSON-typer, bruger MongoDB følgende sammenligningsrækkefølge, fra laveste til højeste:
- MinKey (intern type)
- Nul
- Tal (ints, longs, doubler, decimaler)
- Symbol, streng
- Objekt
- Array
- BinData
- ObjectId
- Boolesk
- Dato
- Tidsstempel
- Regulært udtryk
- MaxKey (intern type)
Antag, at vi har en samling kaldet indlæg med følgende dokumenter:
{ "_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") }
Bemærk, at den første date
feltet indeholder en datostreng, hvorimod de to andre dokumenter bruger et Dato-objekt.
Bemærk også, at datostrengen indeholder nøjagtig samme dato som dokument 3, og denne dato er en senere dato end datoen i dokument 2.
Lad os sortere efter date
felter i disse dokumenter:
db.posts.find().sort({ date: 1 }).pretty()
Resultat:
{ "_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") }
I dette tilfælde sorterede vi i stigende rækkefølge, hvilket betyder, at tidligere datoer bør komme først. Vores første dokument indeholder dog en datostreng i stedet for et Date-objekt, og det kom derfor først – selvom dets dato er senere end datoen i dokument 2.
Her er den igen, men i faldende rækkefølge:
db.posts.find().sort({ date: -1 }).pretty()
Resultat:
{ "_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" }
Endnu en gang bestilles de forskellige datatyper separat i sig selv.
Sortering af tekstresultatmetadata
Du kan bruge { $meta: "textScore" }
argument for at sortere efter faldende relevansscore ved brug af $text
søgninger.
Eksempel
db.posts.find(
{ $text: { $search: "funny" } },
{ score: { $meta: "textScore" }}
).sort({ score: { $meta: "textScore" } }
).pretty()
Resultat:
{ "_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 }
I dette eksempel sorterede vi efter { $meta: "textScore" }
.
Fra MongoDB 4.4 linjen, der går { score: { $meta: "textScore" }}
er valgfri. Udeladelse af dette vil udelade score
felt fra resultaterne. Derfor kan vi gøre følgende (fra MongoDB 4.4):
db.posts.find(
{ $text: { $search: "funny" } }
).sort({ score: { $meta: "textScore" } }
).pretty()
Resultat:
{ "_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" }
Gør $text
søgninger som denne kræver, at vi har oprettet et tekstindeks. Hvis ikke, en IndexNotFound
fejl vil blive returneret.
Flere oplysninger
Se MongoDB-dokumentationen for mere information.