Wanneer u query's uitvoert in MongoDB, hebt u de mogelijkheid om de geretourneerde documenten te beperken. Hier geeft u een maximum aantal documenten op dat door de bewerking moet worden geretourneerd.
Als een bewerking bijvoorbeeld normaal 2.000 documenten retourneert, maar u een limiet van 1.000 opgeeft, worden er slechts 1.000 documenten geretourneerd. Als de bewerking echter slechts 500 documenten retourneert, worden alle 500 geretourneerd (omdat ze de limiet van 1000 documenten niet overschrijden).
Dit lijkt een beetje op het gebruik van de TOP
clausule in SQL Server, of de LIMIT
clausule in MySQL, MariaDB, PostgreSQL en SQLite.
Door het aantal geretourneerde documenten te beperken, kunnen de prestaties worden verbeterd door te voorkomen dat er meer documenten worden geretourneerd en verwerkt dan nodig is.
In MongoDB kunnen we de cursor.limit()
. gebruiken methode of de $limit
aggregatie-operator om de geretourneerde documenten te beperken.
De cursor.limit()
Methode
Stel dat we een verzameling hebben met de naam pets
met de volgende documenten:
{ "_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 }
We kunnen de limit()
. gebruiken methode om het aantal geretourneerde documenten te beperken bij het opvragen van deze verzameling.
Voorbeeld:
db.pets.find().limit(3)
Resultaat:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
De $limit
Aggregatie-operator
Wanneer u de aggregatiepijplijn gebruikt, kunt u de $limit
. gebruiken aggregatie-operator om de resultaten die worden doorgegeven aan de volgende fase in de pijplijn te beperken.
Voorbeeld:
db.pets.aggregate([
{
$match: { }
},
{
$limit : 3
}
])
Voorbeeld:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
Meestal is de $match
operator zou niet bestaan uit een leeg document zoals we hier hebben. Het zou normaal gesproken een query bevatten waarmee de resultaten in dat deel van de pijplijn kunnen worden gefilterd. Maar in dit geval heb ik een leeg document gebruikt om het voorbeeld gemakkelijker te volgen te maken.
Aangezien ik in de eerste fase een leeg document heb doorgegeven, had ik dit gewoon kunnen doen:
db.pets.aggregate([
{
$limit : 3
}
])
Hoe dan ook, het resultaat was beperkt tot slechts 3 documenten.
Bij gebruik in de aggregatiepijplijn, de $limit
operator kan ergens in het midden van de pijpleiding zitten. Als dat zo is, gaat het de beperkte documenten door naar de volgende fase.
Hier is een voorbeeld om te illustreren wat ik bedoel.
db.pets.aggregate([
{
$match: { }
},
{
$limit : 3
},
{
$match: { "type": "Cat" }
}
])
Resultaat:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
Slechts één kat zat in de beperkte resultaten (ook al zijn er twee katten in het originele document), dus alleen die kat werd gematcht in de derde fase.
Dit is iets anders dan het volgende doen.
db.pets.aggregate([
{
$match: { "type": "Cat" }
},
{
$limit : 3
}
])
Resultaat:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
In dit geval hebben we naar katten gezocht in het originele document en vervolgens de resultaten beperkt tot slechts 3. Aangezien er maar 2 katten zijn, is de $limit
had geen invloed op het resultaat.
Gesorteerde documenten beperken
Als u de resultaten beperkt na het sorteren van de documenten, dan houdt de limiet rekening met de sortering.
Voorbeeld:
db.pets.aggregate([
{
$sort: { "_id": -1 }
},
{
$limit : 3
}
])
Resultaat:
{ "_id" : 7, "name" : "Jake", "type" : "Dog", "weight" : 30 } { "_id" : 6, "name" : "Fetch", "type" : "Dog", "weight" : 17 } { "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 }
In dit geval heb ik alle documenten gesorteerd op hun _id
veld in aflopende volgorde (de -1
specificeert aflopende volgorde).
Hier is het weer in oplopende volgorde (een waarde van 1
specificeert oplopende volgorde):
db.pets.aggregate([
{
$sort: { "_id": 1 }
},
{
$limit : 3
}
])
Resultaat:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
Wanneer u resultaten beperkt nadat ze expliciet zijn gesorteerd, moet u ervoor zorgen dat de sorteerbewerking een stabiele sortering heeft gebruikt.
Een stabiele sortering is er een die elke keer dat deze wordt uitgevoerd dezelfde sorteervolgorde retourneert. Een instabiele sortering aan de andere kant, is er een die een andere sorteervolgorde kan retourneren wanneer deze meerdere keren wordt uitgevoerd.
Om ervoor te zorgen dat u een stabiele sortering uitvoert, moet u ten minste één veld in uw sortering opnemen dat uitsluitend unieke waarden bevat (bijvoorbeeld de _id
veld).
Meer informatie
Zie voor meer informatie de MongoDB-documentatie voor:
cursor.limit()
$limit
(aggregatie)