Quando esegui query In MongoDB, hai la possibilità di limitare i documenti restituiti. Qui è dove si specifica un numero massimo di documenti che devono essere restituiti dall'operazione.
Ad esempio, se un'operazione normalmente restituisce 2.000 documenti, ma si specifica un limite di 1.000, vengono restituiti solo 1.000 documenti. Tuttavia, se l'operazione restituisce, ad esempio, 500 documenti, vengono restituiti tutti i 500 (perché non superano il limite di 1.000 documenti).
È un po' come usare il TOP
clausola in SQL Server o LIMIT
clausola in MySQL, MariaDB, PostgreSQL e SQLite.
Limitare i documenti restituiti può aiutare a migliorare le prestazioni impedendo la restituzione e l'elaborazione di più documenti del necessario.
In MongoDB, possiamo usare cursor.limit()
metodo o il $limit
operatore di aggregazione per limitare i documenti restituiti.
Il cursor.limit()
Metodo
Supponiamo di avere una collezione chiamata pets
con i seguenti documenti:
{ "_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 }
Possiamo usare il limit()
metodo per limitare il numero di documenti restituiti durante l'interrogazione di questa raccolta.
Esempio:
db.pets.find().limit(3)
Risultato:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
Il $limit
Operatore di aggregazione
Quando si utilizza la pipeline di aggregazione, è possibile utilizzare il $limit
operatore di aggregazione per limitare i risultati passati alla fase successiva della pipeline.
Esempio:
db.pets.aggregate([
{
$match: { }
},
{
$limit : 3
}
])
Esempio:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
In genere, il $match
operatore non consisterebbe in un documento vuoto come quello che abbiamo qui. Normalmente includerebbe una query con cui filtrare i risultati in quella parte della pipeline. Ma in questo caso ho usato un documento vuoto per rendere l'esempio più facile da seguire.
Dato che ho passato un documento vuoto nella prima fase, avrei potuto semplicemente fare questo:
db.pets.aggregate([
{
$limit : 3
}
])
In ogni caso, il risultato è stato limitato a soli 3 documenti.
Se utilizzato nella pipeline di aggregazione, $limit
l'operatore potrebbe trovarsi da qualche parte nel mezzo della pipeline. In tal caso, passa i documenti limitati alla fase successiva.
Ecco un esempio per illustrare cosa intendo.
db.pets.aggregate([
{
$match: { }
},
{
$limit : 3
},
{
$match: { "type": "Cat" }
}
])
Risultato:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
Solo un gatto era nei risultati limitati (anche se ci sono due gatti nel documento originale), quindi solo quel gatto è stato abbinato al terzo stadio.
Questo è diverso dal fare quanto segue.
db.pets.aggregate([
{
$match: { "type": "Cat" }
},
{
$limit : 3
}
])
Risultato:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
In questo caso, abbiamo cercato i gatti nel documento originale, quindi abbiamo limitato i risultati a soli 3. Dato che ci sono solo 2 gatti, il $limit
non ha avuto alcun impatto sul risultato.
Limitazione dei documenti ordinati
Se limiti i risultati dopo aver ordinato i documenti, il limite terrà conto dell'ordinamento.
Esempio:
db.pets.aggregate([
{
$sort: { "_id": -1 }
},
{
$limit : 3
}
])
Risultato:
{ "_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 questo caso, ho ordinato tutti i documenti in base al loro _id
campo in ordine decrescente (il -1
specifica l'ordine decrescente).
Eccolo di nuovo in ordine crescente (un valore di 1
specifica l'ordine crescente):
db.pets.aggregate([
{
$sort: { "_id": 1 }
},
{
$limit : 3
}
])
Risultato:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
Quando limiti i risultati dopo che sono stati ordinati in modo esplicito, assicurati che l'operazione di ordinamento abbia utilizzato un ordinamento stabile.
Un ordinamento stabile è uno che restituisce lo stesso ordinamento ogni volta che viene eseguito. Un ordinamento instabile d'altra parte, è uno che può restituire un ordinamento diverso se eseguito più volte.
Per assicurarti di eseguire un ordinamento stabile, includi almeno un campo nell'ordinamento che contenga esclusivamente valori univoci (ad esempio, il _id
campo).
Maggiori informazioni
Per ulteriori informazioni, consulta la documentazione di MongoDB per:
cursor.limit()
$limit
(aggregazione)