MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

2 modi per limitare i documenti restituiti in MongoDB

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)