När du kör frågor i MongoDB har du möjlighet att begränsa antalet dokument som returneras. Det är här du anger ett maximalt antal dokument som ska returneras av operationen.
Till exempel, om en operation normalt skulle returnera 2 000 dokument, men du anger en gräns på 1 000, returneras endast 1 000 dokument. Men om operationen bara skulle returnera till exempel 500 dokument, så returneras alla 500 (eftersom de inte bryter mot gränsen på 1 000 dokument).
Det här är lite som att använda TOP
sats i SQL Server, eller LIMIT
sats i MySQL, MariaDB, PostgreSQL och SQLite.
Att begränsa antalet returnerade dokument kan bidra till att förbättra prestandan genom att förhindra att fler dokument returneras och bearbetas än vad som är nödvändigt.
I MongoDB kan vi använda cursor.limit()
metoden eller $limit
aggregeringsoperatör för att begränsa de dokument som returneras.
cursor.limit()
Metod
Anta att vi har en samling som heter pets
med följande dokument:
{ "_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 }
Vi kan använda limit()
metod för att begränsa antalet dokument som returneras när du frågar efter den här samlingen.
Exempel:
db.pets.find().limit(3)
Resultat:
{ "_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
Aggregationsoperatör
När du använder aggregeringspipelinen kan du använda $limit
aggregeringsoperatör för att begränsa resultaten som skickas till nästa steg i pipelinen.
Exempel:
db.pets.aggregate([
{
$match: { }
},
{
$limit : 3
}
])
Exempel:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
Vanligtvis är $match
operatören skulle inte bestå av ett tomt dokument som vi har här. Det skulle normalt inkludera en fråga för att filtrera resultaten på den delen av pipelinen. Men i det här fallet använde jag ett tomt dokument för att göra exemplet lättare att följa.
Med tanke på att jag klarade ett tomt dokument i det första steget kunde jag bara ha gjort så här:
db.pets.aggregate([
{
$limit : 3
}
])
Hur som helst var resultatet begränsat till bara 3 dokument.
När $limit
används i aggregeringspipelinen operatören kan vara någonstans i mitten av pipelinen. Om så är fallet skickar den de begränsade dokumenten till nästa steg.
Här är ett exempel för att illustrera vad jag menar.
db.pets.aggregate([
{
$match: { }
},
{
$limit : 3
},
{
$match: { "type": "Cat" }
}
])
Resultat:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
Endast en katt var med i de begränsade resultaten (även om det finns två katter i originaldokumentet) så endast den katten matchades i det tredje steget.
Detta skiljer sig från att göra följande.
db.pets.aggregate([
{
$match: { "type": "Cat" }
},
{
$limit : 3
}
])
Resultat:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
I det här fallet sökte vi efter katter i originaldokumentet och begränsade sedan resultaten till bara 3. Eftersom det bara finns 2 katter, är $limit
hade ingen inverkan på resultatet.
Begränsning av sorterade dokument
Om du begränsar resultaten efter att du har sorterat dokumenten, kommer gränsen att ta hänsyn till sorteringen.
Exempel:
db.pets.aggregate([
{
$sort: { "_id": -1 }
},
{
$limit : 3
}
])
Resultat:
{ "_id" : 7, "name" : "Jake", "type" : "Dog", "weight" : 30 } { "_id" : 6, "name" : "Fetch", "type" : "Dog", "weight" : 17 } { "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 }
I det här fallet sorterade jag alla dokument efter deras _id
fältet i fallande ordning (-1
anger fallande ordning).
Här är det återigen i stigande ordning (värdet 1
). anger stigande ordning):
db.pets.aggregate([
{
$sort: { "_id": 1 }
},
{
$limit : 3
}
])
Resultat:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
När du begränsar resultat efter att de uttryckligen har sorterats, se till att sorteringsoperationen använde en stabil sortering.
En stabil sort är en som returnerar samma sorteringsordning varje gång den utförs. En instabil sortering å andra sidan, är en som kan returnera en annan sorteringsordning när den utförs flera gånger.
För att säkerställa att du utför en stabil sortering, inkludera minst ett fält i din sortering som innehåller exklusivt unika värden (till exempel _id
fält).
Mer information
För mer information, se MongoDB-dokumentationen för:
cursor.limit()
$limit
(aggregation)