Podczas uruchamiania zapytań W MongoDB masz możliwość ograniczenia zwracanych dokumentów. W tym miejscu określasz maksymalną liczbę dokumentów, które mają zostać zwrócone przez operację.
Na przykład, jeśli operacja normalnie zwróciłaby 2000 dokumentów, ale określisz limit 1000, zwróconych zostanie tylko 1000 dokumentów. Jeśli jednak operacja zwróci powiedzmy tylko 500 dokumentów, wszystkie 500 zostaną zwrócone (ponieważ nie przekraczają limitu 1000 dokumentów).
To trochę jak użycie TOP
klauzula w SQL Server lub LIMIT
klauzula w MySQL, MariaDB, PostgreSQL i SQLite.
Ograniczenie zwracanych dokumentów może pomóc poprawić wydajność, zapobiegając zwracaniu i przetwarzaniu większej liczby dokumentów niż jest to konieczne.
W MongoDB możemy użyć cursor.limit()
metoda lub $limit
operator agregacji, aby ograniczyć zwracane dokumenty.
cursor.limit()
Metoda
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" : "Bat", "weight" : 3 } { "_id" : 6, "name" : "Fetch", "type" : "Dog", "weight" : 17 } { "_id" : 7, "name" : "Jake", "type" : "Dog", "weight" : 30 }
Możemy użyć limit()
metoda, aby ograniczyć liczbę dokumentów zwracanych podczas odpytywania tej kolekcji.
Przykład:
db.pets.find().limit(3)
Wynik:
{ "_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
Operator agregacji
Korzystając z potoku agregacji, możesz użyć $limit
operator agregacji, aby ograniczyć wyniki przekazywane do następnego etapu w potoku.
Przykład:
db.pets.aggregate([
{
$match: { }
},
{
$limit : 3
}
])
Przykład:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
Zazwyczaj $match
operator nie składałby się z pustego dokumentu, jaki mamy tutaj. Zwykle zawiera zapytanie, za pomocą którego można filtrować wyniki w tej części potoku. Ale w tym przypadku użyłem pustego dokumentu, aby ułatwić naśladowanie przykładu.
Biorąc pod uwagę, że w pierwszym etapie zdałem pusty dokument, mogłem po prostu to zrobić:
db.pets.aggregate([
{
$limit : 3
}
])
Tak czy inaczej, wynik był ograniczony do zaledwie 3 dokumentów.
W przypadku użycia w potoku agregacji $limit
operator może znajdować się gdzieś pośrodku rurociągu. Jeśli tak, przekazuje ograniczone dokumenty do następnego etapu.
Oto przykład ilustrujący, o co mi chodzi.
db.pets.aggregate([
{
$match: { }
},
{
$limit : 3
},
{
$match: { "type": "Cat" }
}
])
Wynik:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
Tylko jeden kot był w ograniczonych wynikach (mimo że w oryginalnym dokumencie są dwa koty), więc tylko ten kot został dopasowany na trzecim etapie.
Różni się to od wykonywania poniższych czynności.
db.pets.aggregate([
{
$match: { "type": "Cat" }
},
{
$limit : 3
}
])
Wynik:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
W tym przypadku szukaliśmy kotów w oryginalnym dokumencie, a następnie ograniczyliśmy wyniki do zaledwie 3. Biorąc pod uwagę, że są tylko 2 koty, $limit
nie miało wpływu na wynik.
Ograniczenie sortowanych dokumentów
Jeśli ograniczysz wyniki po posortowaniu dokumentów, limit będzie uwzględniał sortowanie.
Przykład:
db.pets.aggregate([
{
$sort: { "_id": -1 }
},
{
$limit : 3
}
])
Wynik:
{ "_id" : 7, "name" : "Jake", "type" : "Dog", "weight" : 30 } { "_id" : 6, "name" : "Fetch", "type" : "Dog", "weight" : 17 } { "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 }
W tym przypadku posortowałem wszystkie dokumenty według ich _id
pole w porządku malejącym (-1
określa kolejność malejącą).
Tutaj znowu jest w porządku rosnącym (wartość 1
określa kolejność rosnącą):
db.pets.aggregate([
{
$sort: { "_id": 1 }
},
{
$limit : 3
}
])
Wynik:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
Ograniczając wyniki po ich jawnym posortowaniu, upewnij się, że operacja sortowania używa stabilnego sortowania.
stabilne sortowanie to taki, który zwraca ten sam porządek sortowania za każdym razem, gdy jest wykonywany. niestabilne sortowanie z drugiej strony to taki, który może zwrócić inną kolejność sortowania, gdy jest wykonywany wiele razy.
Aby upewnić się, że przeprowadzasz stabilne sortowanie, uwzględnij w sortowaniu co najmniej jedno pole, które zawiera wyłącznie unikalne wartości (na przykład _id
pole).
Więcej informacji
Więcej informacji można znaleźć w dokumentacji MongoDB:
cursor.limit()
$limit
(agregacja)