MongoDB - Requêtes couvertes

Dans ce chapitre, nous découvrirons les requêtes couvertes.

Qu'est-ce qu'une requête couverte?

Selon la documentation officielle de MongoDB, une requête couverte est une requête dans laquelle -

  • Tous les champs de la requête font partie d'un index.
  • Tous les champs renvoyés dans la requête sont dans le même index.

Étant donné que tous les champs présents dans la requête font partie d'un index, MongoDB correspond aux conditions de la requête et renvoie le résultat en utilisant le même index sans réellement regarder à l'intérieur des documents. Étant donné que les index sont présents dans la RAM, la récupération des données à partir des index est beaucoup plus rapide que la récupération des données en numérisant des documents.

Utilisation des requêtes couvertes

Pour tester les requêtes couvertes, consultez le document suivant dans le users collection -

{
   "_id": ObjectId("53402597d852426020000003"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "gender": "M",
   "name": "Tom Benzamin",
   "user_name": "tombenzamin"
}

Nous allons d'abord créer un index composé pour le users collecte sur les champs gender et user_name en utilisant la requête suivante -

>db.users.createIndex({gender:1,user_name:1})
{
	"createdCollectionAutomatically" : false,
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"ok" : 1
}

Maintenant, cet index couvrira la requête suivante -

>db.users.find({gender:"M"},{user_name:1,_id:0})
{ "user_name" : "tombenzamin" }

C'est-à-dire que pour la requête ci-dessus, MongoDB n'irait pas chercher dans les documents de la base de données. Au lieu de cela, il récupère les données requises à partir des données indexées, ce qui est très rapide.

Puisque notre index n'inclut pas _idfield, nous l'avons explicitement exclu de l'ensemble de résultats de notre requête, car MongoDB renvoie par défaut le champ _id dans chaque requête. Ainsi, la requête suivante n'aurait pas été couverte dans l'index créé ci-dessus -

>db.users.find({gender:"M"},{user_name:1})
{ "_id" : ObjectId("53402597d852426020000003"), "user_name" : "tombenzamin" }

Enfin, rappelez-vous qu'un index ne peut pas couvrir une requête si -

  • L'un des champs indexés est un tableau
  • L'un des champs indexés est un sous-document