MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

sortowanie MongoDB()

W MongoDB cursor.sort() Metoda określa kolejność, w jakiej zapytanie zwraca pasujące dokumenty.

sort() Metoda akceptuje dokument, który określa pole do sortowania i porządek sortowania. Porządek sortowania może być następujący:1 rosnąco lub -1 do zjazdu.

Możesz również określić { $meta: "textScore" } podczas wykonywania $text wyszukiwania, aby posortować według obliczonego textScore metadane w porządku malejącym.

Przykładowe dane

Załóżmy, że mamy kolekcję o nazwie pets z następującymi dokumentami:

{ "_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 }

Sortuj w porządku rosnącym

Aby posortować w porządku rosnącym, używamy 1 dla porządku sortowania.

Poniżej znajduje się przykład zapytania, które używa $sort operator do sortowania tej kolekcji według weight pole w kolejności rosnącej.

db.pets.find().sort({ weight: 1 })

Wynik:

{ "_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 }

Sortuj w porządku malejącym

Aby posortować w porządku malejącym, używamy -1 dla porządku sortowania.

db.pets.find().sort({ weight: -1 })

Wynik:

{ "_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 }

Sortuj według wielu pól

Aby posortować według więcej niż jednego pola, oddziel kombinację każdego pola/porządku sortowania przecinkiem.

Przykład

db.pets.find().sort({ type: 1, weight: -1, _id: 1 })

Wynik:

{ "_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 }

W tym przykładzie posortowaliśmy według type najpierw pole w kolejności rosnącej, a następnie według weight pole w kolejności malejącej, a następnie według _id pole w porządku rosnącym.

Oznacza to, że jeśli istnieje wiele zwierząt tego samego typu, są one sortowane według ich weight w kolejności malejącej. Jeśli istnieje wiele zwierząt o tym samym typie i wadze, te zwierzęta są sortowane według _id pole w porządku rosnącym. Gdybyśmy nie uwzględnili _id w procesie sortowania, wtedy te zwierzęta tego samego typu i wagi mogą pojawić się w dowolnej kolejności. Dzieje się tak za każdym razem, gdy uruchamiamy zapytanie. Bez posiadania pola sortowania w unikalnym polu (takim jak _id pola), byłoby całkiem możliwe (nawet prawdopodobne), że wyniki będą zwracane w innej kolejności przy każdym uruchomieniu zapytania.

Sortowanie różnych typów

Porównując wartości różnych typów BSON, MongoDB stosuje następującą kolejność porównania, od najniższej do najwyższej:

  1. MinKey (typ wewnętrzny)
  2. Numer
  3. Liczby (int, long, double, dziesiętne)
  4. Symbol, ciąg
  5. Obiekt
  6. Tablica
  7. BinData
  8. Identyfikator obiektu
  9. Boole'a
  10. Data
  11. sygnatura czasowa
  12. Wyrażenie regularne
  13. MaxKey (typ wewnętrzny)

Załóżmy, że mamy kolekcję o nazwie posty z następującymi dokumentami:

{
	"_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")
}

Zauważ, że pierwsza date pole zawiera ciąg daty, podczas gdy pozostałe dwa dokumenty używają obiektu Date.

Zauważ również, że ciąg daty zawiera dokładnie taką samą datę jak w dokumencie 3, a data ta jest późniejsza niż data w dokumencie 2.

Posortujmy według date pola tych dokumentów:

db.posts.find().sort({ date: 1 }).pretty()

Wynik:

{
	"_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")
}

W tym przypadku posortowaliśmy w porządku rosnącym, co oznacza, że ​​wcześniejsze daty powinny być pierwsze. Jednak nasz pierwszy dokument zawiera ciąg daty zamiast obiektu Date, więc pojawił się jako pierwszy — mimo że jego data jest późniejsza niż data w dokumencie 2.

I znowu, ale w porządku malejącym:

db.posts.find().sort({ date: -1 }).pretty()

Wynik:

{
	"_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"
}

Po raz kolejny różne typy danych są uporządkowane osobno.

Sortowanie metadanych wyniku tekstowego

Możesz użyć { $meta: "textScore" } argument do sortowania według malejącego wyniku trafności przy użyciu $text wyszukiwania.

Przykład

db.posts.find(
   { $text: { $search: "funny" } },
   { score: { $meta: "textScore" }}
).sort({ score: { $meta: "textScore" } }
).pretty()

Wynik:

{
	"_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
}

W tym przykładzie posortowaliśmy według { $meta: "textScore" } .

Od MongoDB 4.4 linia, która idzie { score: { $meta: "textScore" }} jest opcjonalne. Pominięcie tego spowoduje pominięcie score pole z wyników. Dlatego możemy wykonać następujące czynności (z MongoDB 4.4):

db.posts.find(
   { $text: { $search: "funny" } }
).sort({ score: { $meta: "textScore" } }
).pretty()

Wynik:

{
	"_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"
}

Robienie $text wyszukiwania takie jak to wymagają utworzenia indeksu tekstowego. Jeśli nie, IndexNotFound zostanie zwrócony błąd.

Więcej informacji

Więcej informacji znajdziesz w dokumentacji MongoDB.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. mongodb jak zmienić domyślny port

  2. Jak formatować liczby za pomocą przecinków w SQL?

  3. W MongoDB szukaj w tablicy i sortuj według liczby dopasowań

  4. Zrób coś, jeśli nic nie zostanie znalezione za pomocą .find() mangusta

  5. Replikacja MongoDB w hybrydowym środowisku chmury