Когато изпълнявате заявки в MongoDB, имате възможност да ограничите върнатите документи. Тук можете да посочите максимален брой документи, които да бъдат върнати от операцията.
Например, ако една операция обикновено връща 2000 документа, но вие посочите ограничение от 1000, тогава се връщат само 1000 документа. Ако обаче операцията върне само 500 документа, тогава всичките 500 се връщат (защото не нарушават ограничението от 1000 документа).
Това е малко като използването на TOP
клауза в SQL Server или LIMIT
клауза в MySQL, MariaDB, PostgreSQL и SQLite.
Ограничаването на връщаните документи може да помогне за подобряване на производителността, като предотврати връщането и обработката на повече документи, отколкото е необходимо.
В MongoDB можем да използваме cursor.limit()
метод или $limit
оператор за агрегиране, за да ограничи върнатите документи.
cursor.limit()
Метод
Да предположим, че имаме колекция, наречена pets
със следните документи:
{ "_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" : "Bat", "weight" : 3 } { "_id" : 6, "name" : "Fetch", "type" : "Dog", "weight" : 17 } { "_id" : 7, "name" : "Jake", "type" : "Dog", "weight" : 30 }
Можем да използваме limit()
метод за ограничаване на броя на документите, върнати при запитване към тази колекция.
Пример:
db.pets.find().limit(3)
Резултат:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
$limit
Оператор за агрегиране
Когато използвате конвейера за агрегиране, можете да използвате $limit
оператор за агрегиране, за да ограничи резултатите, предавани към следващия етап в конвейера.
Пример:
db.pets.aggregate([
{
$match: { }
},
{
$limit : 3
}
])
Пример:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
Обикновено $match
операторът няма да се състои от празен документ, какъвто имаме тук. Обикновено включва заявка, с която да се филтрират резултатите в тази част от конвейера. Но в този случай използвах празен документ, за да направя примера по-лесен за следване.
Като се има предвид, че предах празен документ в първия етап, можех просто да направя това:
db.pets.aggregate([
{
$limit : 3
}
])
Така или иначе резултатът беше ограничен до само 3 документа.
Когато се използва в конвейера за агрегиране, $limit
операторът може да е някъде по средата на тръбопровода. Ако е така, той предава ограничените документи към следващия етап.
Ето един пример, който да илюстрира какво имам предвид.
db.pets.aggregate([
{
$match: { }
},
{
$limit : 3
},
{
$match: { "type": "Cat" }
}
])
Резултат:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
Само една котка беше в ограничените резултати (въпреки че в оригиналния документ има две котки), така че само тази котка беше съпоставена на третия етап.
Това е различно от това да направите следното.
db.pets.aggregate([
{
$match: { "type": "Cat" }
},
{
$limit : 3
}
])
Резултат:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
В този случай потърсихме котки в оригиналния документ, след което ограничихме резултатите до само 3. Като се има предвид, че има само 2 котки, $limit
нямаше влияние върху резултата.
Ограничаване на сортираните документи
Ако ограничите резултатите след сортиране на документите, тогава ограничението ще вземе под внимание сортирането.
Пример:
db.pets.aggregate([
{
$sort: { "_id": -1 }
},
{
$limit : 3
}
])
Резултат:
{ "_id" : 7, "name" : "Jake", "type" : "Dog", "weight" : 30 } { "_id" : 6, "name" : "Fetch", "type" : "Dog", "weight" : 17 } { "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 }
В този случай сортирах всички документи по техния _id
поле в низходящ ред (-1
определя низходящ ред).
Тук отново е във възходящ ред (стойност 1
определя възходящ ред):
db.pets.aggregate([
{
$sort: { "_id": 1 }
},
{
$limit : 3
}
])
Резултат:
{ "_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
поле).
Повече информация
За повече информация вижте документацията на MongoDB за:
cursor.limit()
$limit
(агрегиране)