MongoDB - Consultas Cobertas

Neste capítulo, aprenderemos sobre as consultas cobertas.

O que é uma consulta coberta?

De acordo com a documentação oficial do MongoDB, uma consulta coberta é uma consulta na qual -

  • Todos os campos da consulta fazem parte de um índice.
  • Todos os campos retornados na consulta estão no mesmo índice.

Como todos os campos presentes na consulta fazem parte de um índice, o MongoDB corresponde às condições da consulta e retorna o resultado usando o mesmo índice, sem realmente olhar dentro dos documentos. Como os índices estão presentes na RAM, a busca de dados de índices é muito mais rápida em comparação com a busca de dados por digitalização de documentos.

Usando consultas cobertas

Para testar as consultas cobertas, considere o seguinte documento no users coleção -

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

Vamos primeiro criar um índice composto para o users coleção nos campos gender e user_name usando a seguinte consulta -

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

Agora, este índice cobrirá a seguinte consulta -

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

Isso quer dizer que para a consulta acima, o MongoDB não iria procurar nos documentos do banco de dados. Em vez disso, ele buscaria os dados necessários de dados indexados, o que é muito rápido.

Como nosso índice não inclui _id, nós o excluímos explicitamente do conjunto de resultados de nossa consulta, pois o MongoDB, por padrão, retorna o campo _id em cada consulta. Portanto, a seguinte consulta não teria sido coberta dentro do índice criado acima -

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

Por último, lembre-se de que um índice não pode cobrir uma consulta se -

  • Qualquer um dos campos indexados é uma matriz
  • Qualquer um dos campos indexados é um subdocumento