sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB sort()

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šší:

  1. MinKey (interní typ)
  2. Nulé
  3. Čísla (ints, longs, double, desetinná místa)
  4. Symbol, řetězec
  5. Objekt
  6. Pole
  7. BinData
  8. ObjectId
  9. Booleovská hodnota
  10. Datum
  11. Časové razítko
  12. Regulární výraz
  13. 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.


  1. Vytvoření nové sady z řady Sorted Set v Redis

  2. Pracovat se dvěma samostatnými instancemi redis s sidekiq?

  3. Použití Redis s Node.js a Socket.IO

  4. Mongoimport souboru JSON