MongoDB - Query coperte
In questo capitolo, impareremo le query coperte.
Che cos'è una query coperta?
Secondo la documentazione ufficiale di MongoDB, una query coperta è una query in cui:
- Tutti i campi della query fanno parte di un indice.
- Tutti i campi restituiti nella query si trovano nello stesso indice.
Poiché tutti i campi presenti nella query fanno parte di un indice, MongoDB soddisfa le condizioni della query e restituisce il risultato utilizzando lo stesso indice senza effettivamente guardare all'interno dei documenti. Poiché gli indici sono presenti nella RAM, il recupero dei dati dagli indici è molto più veloce rispetto al recupero dei dati mediante la scansione dei documenti.
Utilizzo delle query coperte
Per testare le query coperte, considera il seguente documento in users raccolta -
{
"_id": ObjectId("53402597d852426020000003"),
"contact": "987654321",
"dob": "01-01-1991",
"gender": "M",
"name": "Tom Benzamin",
"user_name": "tombenzamin"
}
Per prima cosa creeremo un indice composto per users raccolta sui campi gender e user_name utilizzando la seguente query -
>db.users.createIndex({gender:1,user_name:1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
Ora, questo indice coprirà la seguente query:
>db.users.find({gender:"M"},{user_name:1,_id:0})
{ "user_name" : "tombenzamin" }
Vale a dire che per la query sopra, MongoDB non esaminerà i documenti del database. Invece recupererebbe i dati richiesti dai dati indicizzati che è molto veloce.
Poiché il nostro indice non include _idcampo, lo abbiamo escluso esplicitamente dal set di risultati della nostra query, poiché MongoDB per impostazione predefinita restituisce il campo _id in ogni query. Quindi la seguente query non sarebbe stata coperta all'interno dell'indice creato sopra -
>db.users.find({gender:"M"},{user_name:1})
{ "_id" : ObjectId("53402597d852426020000003"), "user_name" : "tombenzamin" }
Infine, ricorda che un indice non può coprire una query se:
- Uno dei campi indicizzati è un array
- Uno dei campi indicizzati è un documento secondario