В MongoDB можете да сортирате резултатите от заявка, като използвате limit()
метод.
В MongoDB, когато правите заявка за колекция с помощта на db.collection.find()
метод, можете да добавите sort()
метод, за да посочите как трябва да бъдат сортирани резултатите. sort()
метод определя ред на сортиране за курсора.
Когато използвате sort()
метод, трябва да предоставите реда на сортиране като параметър. Това трябва да е JSON документ, който дефинира реда на сортиране. Обикновено ще съдържа едно или повече полета, всяко следвано от 1
или -1
, в зависимост от това дали сортирането трябва да бъде във възходящ или низходящ ред.
Пример
Първо нека направим заявка без използвайки sort()
(за да можем да видим естествения ред на сортиране):
Без sort()
db.musicians.find( )
Резултат:
{ "_id" : 1, "name" : "Ian Gillan", "instrument" : "Vocals" } { "_id" : 2, "name" : "Ian Paice", "instrument" : "Drums", "born" : 1948 } { "_id" : 3, "name" : "Roger Glover", "instrument" : "Bass", "born" : 1945 } { "_id" : 4, "name" : "Steve Morse", "instrument" : "Guitar", "born" : 1954 } { "_id" : 5, "name" : "Don Airey", "instrument" : "Keyboards", "born" : 1948 } { "_id" : 6, "name" : "Jeff Martin", "instrument" : "Vocals", "born" : 1969 } { "_id" : 7, "name" : "Jeff Burrows", "instrument" : "Drums", "born" : 1968 } { "_id" : 8, "name" : "Stuart Chatwood", "instrument" : "Bass", "born" : 1969 }
С sort()
във възходящ ред
Стойност на 1
до име на поле указва, че документите трябва да бъдат сортирани по посоченото поле във възходящ ред.
Тук сортираме резултатите по име във възходящ ред:
db.musicians.find( ).sort( { name: 1 } )
Резултат:
{ "_id" : 5, "name" : "Don Airey", "instrument" : "Keyboards", "born" : 1948 } { "_id" : 1, "name" : "Ian Gillan", "instrument" : "Vocals" } { "_id" : 2, "name" : "Ian Paice", "instrument" : "Drums", "born" : 1948 } { "_id" : 7, "name" : "Jeff Burrows", "instrument" : "Drums", "born" : 1968 } { "_id" : 6, "name" : "Jeff Martin", "instrument" : "Vocals", "born" : 1969 } { "_id" : 3, "name" : "Roger Glover", "instrument" : "Bass", "born" : 1945 } { "_id" : 4, "name" : "Steve Morse", "instrument" : "Guitar", "born" : 1954 } { "_id" : 8, "name" : "Stuart Chatwood", "instrument" : "Bass", "born" : 1969 }
С sort()
в низходящ ред
Стойност -1
до име на поле указва низходящ ред.
Тук сортираме резултатите по име в низходящ ред:
db.musicians.find( ).sort( { name: -1 } )
Резултат:
{ "_id" : 8, "name" : "Stuart Chatwood", "instrument" : "Bass", "born" : 1969 } { "_id" : 4, "name" : "Steve Morse", "instrument" : "Guitar", "born" : 1954 } { "_id" : 3, "name" : "Roger Glover", "instrument" : "Bass", "born" : 1945 } { "_id" : 6, "name" : "Jeff Martin", "instrument" : "Vocals", "born" : 1969 } { "_id" : 7, "name" : "Jeff Burrows", "instrument" : "Drums", "born" : 1968 } { "_id" : 2, "name" : "Ian Paice", "instrument" : "Drums", "born" : 1948 } { "_id" : 1, "name" : "Ian Gillan", "instrument" : "Vocals" } { "_id" : 5, "name" : "Don Airey", "instrument" : "Keyboards", "born" : 1948 }
Множество полета
Можете да сортирате по множество полета. Просто отделете всяко поле със запетая. Когато направите това, документите ще бъдат сортирани по първото посочено поле, след това по следващото и т.н.
Тук сортираме по инструмента поле, последвано от роден поле. Ако двама или повече музиканти свирят на един и същ инструмент, роденият поле определя как те са сортирани един спрямо друг.
db.musicians.find( ).sort( { instrument: 1, born: 1 } )
Резултат:
{ "_id" : 3, "name" : "Roger Glover", "instrument" : "Bass", "born" : 1945 } { "_id" : 8, "name" : "Stuart Chatwood", "instrument" : "Bass", "born" : 1969 } { "_id" : 2, "name" : "Ian Paice", "instrument" : "Drums", "born" : 1948 } { "_id" : 7, "name" : "Jeff Burrows", "instrument" : "Drums", "born" : 1968 } { "_id" : 4, "name" : "Steve Morse", "instrument" : "Guitar", "born" : 1954 } { "_id" : 5, "name" : "Don Airey", "instrument" : "Keyboards", "born" : 1948 } { "_id" : 1, "name" : "Ian Gillan", "instrument" : "Vocals" } { "_id" : 6, "name" : "Jeff Martin", "instrument" : "Vocals", "born" : 1969 }
И само за да видите как второто поле може да повлияе на поръчката, превключете го на отрицателна стойност (надолу):
db.musicians.find( ).sort( { instrument: 1, born: -1 } )
Резултат:
{ "_id" : 8, "name" : "Stuart Chatwood", "instrument" : "Bass", "born" : 1969 } { "_id" : 3, "name" : "Roger Glover", "instrument" : "Bass", "born" : 1945 } { "_id" : 7, "name" : "Jeff Burrows", "instrument" : "Drums", "born" : 1968 } { "_id" : 2, "name" : "Ian Paice", "instrument" : "Drums", "born" : 1948 } { "_id" : 4, "name" : "Steve Morse", "instrument" : "Guitar", "born" : 1954 } { "_id" : 5, "name" : "Don Airey", "instrument" : "Keyboards", "born" : 1948 } { "_id" : 6, "name" : "Jeff Martin", "instrument" : "Vocals", "born" : 1969 } { "_id" : 1, "name" : "Ian Gillan", "instrument" : "Vocals" }
Сортиране с лимит
Можете да използвате sort()
с limit()
за да сортирате резултатите от ограничения набор от резултати.
Тук ограничаваме резултатите до 3 документа:
db.musicians.find( ).limit(3).sort( { name: 1, born: -1 } )
Резултат:
{ "_id" : 5, "name" : "Don Airey", "instrument" : "Keyboards", "born" : 1948 } { "_id" : 1, "name" : "Ian Gillan", "instrument" : "Vocals" } { "_id" : 2, "name" : "Ian Paice", "instrument" : "Drums", "born" : 1948 }
Ако сменим име в низходящ ред:
db.musicians.find( ).limit(3).sort( { name: -1, born: -1 } )
Резултат:
{ "_id" : 8, "name" : "Stuart Chatwood", "instrument" : "Bass", "born" : 1969 } { "_id" : 4, "name" : "Steve Morse", "instrument" : "Guitar", "born" : 1954 } { "_id" : 3, "name" : "Roger Glover", "instrument" : "Bass", "born" : 1945 }
Имайте предвид, че в този случай роден няма ефект, тъй като никога няма повече от един резултат за дадено име.
Сравняване на различни типове
Когато сравнява стойности на различни типове BSON, MongoDB използва следния ред на сравнение, от най-ниския към най-високия:
- MinKey (вътрешен тип)
- Null
- Числа (цели, дълги, двойни)
- Символ, низ
- Обект
- Масив
- BinData
- ObjectId
- Булева
- Дата
- Часово клеймо
- Регулярен израз
- MaxKey (вътрешен тип)
Имайте предвид, че несъществуващите полета се третират по същия начин като нулева стойност (или празен BSON обект).