MongoDB - Consultas cubiertas

En este capítulo, aprenderemos acerca de las consultas cubiertas.

¿Qué es una consulta cubierta?

Según la documentación oficial de MongoDB, una consulta cubierta es una consulta en la que:

  • Todos los campos de la consulta forman parte de un índice.
  • Todos los campos devueltos en la consulta están en el mismo índice.

Dado que todos los campos presentes en la consulta son parte de un índice, MongoDB coincide con las condiciones de la consulta y devuelve el resultado utilizando el mismo índice sin mirar dentro de los documentos. Dado que los índices están presentes en la RAM, la obtención de datos de índices es mucho más rápida en comparación con la obtención de datos mediante el escaneo de documentos.

Usar consultas cubiertas

Para probar las consultas cubiertas, considere el siguiente documento en el users colección -

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

Primero crearemos un índice compuesto para el users colección en los campos gender y user_name usando la siguiente consulta -

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

Ahora, este índice cubrirá la siguiente consulta:

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

Es decir, para la consulta anterior, MongoDB no buscaría documentos de base de datos. En su lugar, obtendría los datos requeridos de los datos indexados, lo que es muy rápido.

Dado que nuestro índice no incluye _id, lo hemos excluido explícitamente del conjunto de resultados de nuestra consulta, ya que MongoDB de forma predeterminada devuelve el campo _id en cada consulta. Por lo tanto, la siguiente consulta no se habría cubierto dentro del índice creado anteriormente:

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

Por último, recuerde que un índice no puede cubrir una consulta si:

  • Cualquiera de los campos indexados es una matriz
  • Cualquiera de los campos indexados es un subdocumento