Når du kører forespørgsler i MongoDB, har du mulighed for at begrænse antallet af returnerede dokumenter. Det er her, du angiver et maksimalt antal dokumenter, der skal returneres af operationen.
For eksempel, hvis en operation normalt ville returnere 2.000 dokumenter, men du angiver en grænse på 1.000, returneres kun 1.000 dokumenter. Men hvis operationen kun ville returnere f.eks. 500 dokumenter, så returneres alle 500 (fordi de ikke overtræder grænsen på 1.000 dokumenter).
Det er lidt ligesom at bruge TOP
klausul i SQL Server eller LIMIT
klausul i MySQL, MariaDB, PostgreSQL og SQLite.
Begrænsning af de returnerede dokumenter kan hjælpe med at forbedre ydeevnen ved at forhindre, at flere dokumenter returneres og behandles, end det er nødvendigt.
I MongoDB kan vi bruge cursor.limit()
metoden eller $limit
aggregeringsoperatør for at begrænse de dokumenter, der returneres.
cursor.limit()
Metode
Antag, at vi har en samling kaldet pets
med følgende dokumenter:
{ "_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 bruge limit()
metode til at begrænse antallet af dokumenter, der returneres, når der forespørges på denne samling.
Eksempel:
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 bruger aggregeringspipelinen, kan du bruge $limit
aggregeringsoperatør for at begrænse de resultater, der sendes til næste fase i pipelinen.
Eksempel:
db.pets.aggregate([
{
$match: { }
},
{
$limit : 3
}
])
Eksempel:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
Typisk er $match
operatør ville ikke bestå af et tomt dokument, som vi har her. Det vil normalt indeholde en forespørgsel, som resultaterne kan filtreres med på den del af pipelinen. Men i dette tilfælde brugte jeg et tomt dokument for at gøre eksemplet lettere at følge.
Da jeg bestod et tomt dokument i den første fase, kunne jeg bare have gjort dette:
db.pets.aggregate([
{
$limit : 3
}
])
Uanset hvad var resultatet begrænset til kun 3 dokumenter.
Når det bruges i aggregeringspipelinen, er $limit
operatøren kunne være et sted i midten af rørledningen. Hvis det er tilfældet, sender den de begrænsede dokumenter til næste trin.
Her er et eksempel for at illustrere, hvad jeg mener.
db.pets.aggregate([
{
$match: { }
},
{
$limit : 3
},
{
$match: { "type": "Cat" }
}
])
Resultat:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
Kun én kat var i de begrænsede resultater (selvom der er to katte i det originale dokument), så kun den kat blev matchet i tredje fase.
Dette er anderledes end at gøre følgende.
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 dette tilfælde søgte vi efter katte i det originale dokument og begrænsede derefter resultaterne til kun 3. Da der kun er 2 katte, er $limit
havde ingen indflydelse på resultatet.
Begrænsning af sorterede dokumenter
Hvis du begrænser resultaterne efter sortering af dokumenterne, vil grænsen tage hensyn til sorteringen.
Eksempel:
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 dette tilfælde sorterede jeg alle dokumenter efter deres _id
felt i faldende rækkefølge (-1
angiver faldende rækkefølge).
Her er det igen i stigende rækkefølge (en værdi på 1
angiver stigende rækkefølge):
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ænser resultater, efter at de eksplicit er blevet sorteret, skal du sikre dig, at sorteringsoperationen brugte en stabil sortering.
En stabil sortering er en, der returnerer den samme sorteringsrækkefølge, hver gang den udføres. En ustabil sortering på den anden side er en, der kan returnere en anden sorteringsrækkefølge, når den udføres flere gange.
For at sikre, at du udfører en stabil sortering, skal du inkludere mindst ét felt i din sortering, der udelukkende indeholder unikke værdier (f.eks. _id
felt).
Flere oplysninger
For mere information, se MongoDB-dokumentationen for:
cursor.limit()
$limit
(sammenlægning)