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.