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