V MongoDB, cursor.sort()
metoda určuje pořadí, ve kterém dotaz vrací odpovídající dokumenty.
sort()
metoda přijímá dokument, který určuje pole k řazení a pořadí řazení. Pořadí řazení může být buď 1
pro vzestupné nebo -1
pro sestup.
Můžete také zadat { $meta: "textScore" }
při provádění $text
prohledává, aby bylo možné seřadit podle vypočteného textScore
metadata v sestupném pořadí.
Ukázková data
Předpokládejme, že máme sbírku nazvanou pets
s následujícími dokumenty:
{ "_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 }
Řadit vzestupně
K řazení ve vzestupném pořadí používáme 1
pro pořadí řazení.
Níže je uveden příklad dotazu, který používá $sort
operátor k seřazení této kolekce podle weight
pole ve vzestupném pořadí.
db.pets.find().sort({ weight: 1 })
Výsledek:
{ "_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 }
Řadit sestupně
Pro řazení v sestupném pořadí používáme -1
pro pořadí řazení.
db.pets.find().sort({ weight: -1 })
Výsledek:
{ "_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 }
Řadit podle více polí
Chcete-li seřadit podle více než jednoho pole, oddělte každé pole/kombinaci pořadí řazení čárkou.
Příklad
db.pets.find().sort({ type: 1, weight: -1, _id: 1 })
Výsledek:
{ "_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 }
V tomto příkladu jsme třídili podle type
pole nejprve vzestupně a poté podle weight
pole v sestupném pořadí a poté pomocí _id
pole ve vzestupném pořadí.
To znamená, že pokud existuje více domácích mazlíčků stejného typu, jsou tato zvířata seřazena podle jejich weight
v sestupném pořadí. Pokud existuje více domácích mazlíčků se stejným typem a hmotností, jsou tato zvířata seřazena podle _id
pole ve vzestupném pořadí. Pokud bychom nezahrnuli _id
pole v procesu třídění, pak se tato zvířata stejného typu a hmotnosti mohou objevit v libovolném pořadí. To platí pokaždé, když spustíme dotaz. Aniž byste měli třídicí pole na jedinečném poli (jako je _id
pole), bylo by zcela možné (dokonce pravděpodobné), že by se výsledky při každém spuštění dotazu vrátily v jiném pořadí.
Řazení různých typů
Při porovnávání hodnot různých typů BSON používá MongoDB následující pořadí porovnání, od nejnižší po nejvyšší:
- MinKey (interní typ)
- Nulé
- Čísla (ints, longs, double, desetinná místa)
- Symbol, řetězec
- Objekt
- Pole
- BinData
- ObjectId
- Booleovská hodnota
- Datum
- Časové razítko
- Regulární výraz
- MaxKey (interní typ)
Předpokládejme, že máme kolekci nazvanou příspěvky s následujícími dokumenty:
{ "_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") }
Všimněte si, že první date
pole obsahuje řetězec data, zatímco ostatní dva dokumenty používají objekt Date.
Všimněte si také, že řetězec data obsahuje přesně stejné datum jako dokument 3 a toto datum je pozdější datum než datum v dokumentu 2.
Seřaďme podle date
pole těchto dokumentů:
db.posts.find().sort({ date: 1 }).pretty()
Výsledek:
{ "_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") }
V tomto případě jsme seřadili vzestupně, což znamená, že dřívější data by měla být na prvním místě. Náš první dokument však obsahuje místo objektu Date řetězec data, a tak byl na prvním místě – i když jeho datum je pozdější než datum v dokumentu 2.
Tady je to znovu, ale v sestupném pořadí:
db.posts.find().sort({ date: -1 }).pretty()
Výsledek:
{ "_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" }
Opět platí, že různé typy dat se objednávají samostatně v sobě.
Třídění metadat skóre textu
Můžete použít { $meta: "textScore" }
argument pro řazení podle sestupného skóre relevance při použití $text
vyhledávání.
Příklad
db.posts.find(
{ $text: { $search: "funny" } },
{ score: { $meta: "textScore" }}
).sort({ score: { $meta: "textScore" } }
).pretty()
Výsledek:
{ "_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 }
V tomto příkladu jsme seřadili podle { $meta: "textScore" }
.
Od MongoDB 4.4 řádek, který jde { score: { $meta: "textScore" }}
je volitelný. Pokud toto vynecháte, vynecháte score
pole z výsledků. Proto můžeme udělat následující (od MongoDB 4.4):
db.posts.find(
{ $text: { $search: "funny" } }
).sort({ score: { $meta: "textScore" } }
).pretty()
Výsledek:
{ "_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" }
Provádím $text
vyhledávání jako toto vyžaduje, abychom vytvořili textový index. Pokud ne, IndexNotFound
bude vrácena chyba.
Další informace
Další informace naleznete v dokumentaci MongoDB.