Você pode usar a explicação dos resultados para determinar as seguintes informações sobre uma query:
O tempo que uma query levou para ser concluída
Se a query usou um índice
O número de documentos e chaves de índice verificados para atender a uma query
Observação
Os resultados do plano de explicação para queries estão sujeitos a alterações entre as versões MongoDB.
Os cursor.explain("executionStats") e os métodos db.collection.explain("executionStats") fornecem estatísticas sobre o desempenho de uma query. Essas estatísticas podem ser úteis para medir se e como uma query utiliza um índice. Consulte db.collection.explain() para detalhes.
O MongoDB Compass fornece uma aba Plano de explicação, que exibe estatísticas sobre o desempenho de uma query. Essas estatísticas podem ser úteis para medir se e como uma query utiliza um índice.
Avalie o desempenho de uma query
Considere uma coleção inventory com os seguintes documentos:
db.inventory.insertMany ( [ { _id: 1, item: "f1", type: "food", quantity: 500 }, { _id: 2, item: "f2", type: "food", quantity: 100 }, { _id: 3, item: "p1", type: "paper", quantity: 200 }, { _id: 4, item: "p2", type: "paper", quantity: 150 }, { _id: 5, item: "f3", type: "food", quantity: 300 }, { _id: 6, item: "t1", type: "toys", quantity: 500 }, { _id: 7, item: "a1", type: "apparel", quantity: 250 }, { _id: 8, item: "a2", type: "apparel", quantity: 400 }, { _id: 9, item: "t2", type: "toys", quantity: 50 }, { _id: 10, item: "f4", type: "food", quantity: 75 } ] )
Os documentos aparecem no MongoDB Compass como os seguintes:

Consulta sem Índice
A query a seguir recupera documentos em que o campo
quantity tem um valor entre 100 e 200,
inclusive:
db.inventory.find( { quantity: { $gte: 100, $lte: 200 } } )
A consulta retorna os seguintes documentos:
{ "_id" : 2, "item" : "f2", "type" : "food", "quantity" : 100 } { "_id" : 3, "item" : "p1", "type" : "paper", "quantity" : 200 } { "_id" : 4, "item" : "p2", "type" : "paper", "quantity" : 150 }
Para exibir o plano de query selecionado, encadeie o método cursor.explain("executionStats") cursor até o final do comando find:
db.inventory.find( { quantity: { $gte: 100, $lte: 200 } } ).explain("executionStats")
explain() retorna os seguintes resultados:
{ queryPlanner: { ... winningPlan: { queryPlan: { stage: 'COLLSCAN', ... } } }, executionStats: { executionSuccess: true, nReturned: 3, executionTimeMillis: 0, totalKeysExamined: 0, totalDocsExamined: 10, executionStages: { stage: 'COLLSCAN', ... }, ... }, ... }
queryPlanner.winningPlan.queryPlan.stageexibeCOLLSCANpara indicar uma verificação de collection.As verificações de collection indicam que
mongodprecisou verificar documento por documento de toda a collection para identificar os resultados. Essa é uma operação geralmente cara e pode resultar em queries lentas.executionStats.nReturnedexibe3para indicar que o plano de query vencedor retorna três documentos.executionStats.totalKeysExaminedexibe0para indicar que esta query não está usando um índice.executionStats.totalDocsExaminedexibe10para indicar que o MongoDB teve que verificar dez documentos (ou seja, todos os documentos na collection) para encontrar os três documentos correspondentes.
A query a seguir recupera documentos em que o campo
quantity tem um valor entre 100 e 200,
inclusive:
Copie o seguinte filtro na barra de query do Compass e clique em Find:
{ quantity: { $gte: 100, $lte: 200 } }
A consulta retorna os seguintes documentos:
Para visualizar o plano de query selecionado:
Clique Explain Plan na guia
test.inventorycollection.Clique em Explain.
O MongoDB Compass exibe o plano de query da seguinte maneira:

Observação
Como estamos trabalhando com um conjunto de dados tão pequeno para os fins deste tutorial, o Actual Query Execution Time exibe 0 segundos, mesmo que não estejamos usando um índice.
Em um conjunto de dados maior, a diferença no tempo de execução da query entre uma query indexada e uma query não indexada seria muito maior.
Árvore visual
O Query Performance Summary mostra as estatísticas de execução da consulta:
Documents Returned exibe
3para indicar que o plano de query vencedor retorna três documentos.Index Keys Examined exibe
0para indicar que essa query não está usando um índice.Documents Examined exibe
10para indicar que o MongoDB teve que verificar dez documentos (ou seja, todos os documentos na coleção) para encontrar os três documentos correspondentes.
Abaixo de Query Performance Summary, o MongoDB Compass exibe o estágio de consulta
COLLSCANpara indicar que uma verificação de collection foi usada para esta consulta.As verificações de collection indicam que
mongodprecisou verificar documento por documento de toda a collection para identificar os resultados. Essa é uma operação geralmente cara e pode resultar em queries lentas.
Raw JSON
Os detalhes explicativos também podem ser visualizados no formato JSON bruto clicando em Raw JSON abaixo da barra de consulta:

A diferença entre o número de documentos correspondentes e o número de documentos examinados pode sugerir que, para melhorar a eficiência, a query pode se beneficiar do uso de um índice.
Consulta com índice
Para suportar a query no campo quantity, adicione um índice no campo quantity:
db.inventory.createIndex( { quantity: 1 } )
Para visualizar as estatísticas do plano de query, use o método explain() :
db.inventory.find( { quantity: { $gte: 100, $lte: 200 } } ).explain("executionStats")
O método explain() retorna os seguintes resultados:
{ queryPlanner: { ... winningPlan: { queryPlan: { stage: 'FETCH', inputStage: { stage: 'IXSCAN', keyPattern: { quantity: 1 }, ... } } }, rejectedPlans: [ ] }, executionStats: { executionSuccess: true, nReturned: 3, executionTimeMillis: 0, totalKeysExamined: 3, totalDocsExamined: 3, executionStages: { ... }, ... }, ... }
queryPlanner.winningPlan.queryPlan.inputStage.stageexibeIXSCANpara indicar o uso do índice.executionStats.nReturnedexibe3para indicar que o plano de query vencedor retorna três documentos.executionStats.totalKeysExaminedexibe3para indicar que o MongoDB verificou três entradas de índice. O número de chaves examinadas corresponde ao número de documentos retornados, o que significa que omongodsó precisou examinar as chaves do índice para retornar os resultados. Omongodnão precisou digitalizar todos os documentos, e apenas os três documentos correspondentes tiveram que ser colocados na memória. Isso resulta em uma query muito eficiente.executionStats.totalDocsExaminedexibe3para indicar que o MongoDB digitalizou três documentos.
Clique Indexes na guia
test.inventorycollection.Clique em Create Index.
Selecione
quantityno menu suspenso Select a field name.Selecione
1 (asc)no menu suspenso de tipos.Clique em Create.
Observação
Deixar o campo do nome do índice em branco faz com que o MongoDB Compass crie um nome padrão para o índice.
Agora você pode ver o índice recém-criado na guia Indexes:

Retorne à aba Explain Plan para a coleção inventory e execute novamente a query da etapa anterior:
{ quantity: { $gte: 100, $lte: 200 } }
O MongoDB Compass exibe o plano de query da seguinte maneira:

Árvore visual
O Query Performance Summary mostra as estatísticas de execução da consulta:
Documents Returned exibe
3para indicar que o plano de query vencedor retorna três documentos.Index Keys Examined exibe
3para indicar que o MongoDB verificou três entradas de índice. O número de chaves examinadas corresponde ao número de documentos retornados, o que significa quemongodsó precisou examinar as chaves do índice para retornar os resultados.mongodnão precisou digitalizar todos os documentos, e apenas os três documentos correspondentes tiveram que ser colocados na memória. Isso resulta em uma query muito eficiente.Documents Examined exibe
3para indicar que o MongoDB verificou três documentos.No lado direito do Query Performance Summary, o MongoDB Compass mostra que a query usou o índice
quantity.
Abaixo do Query Performance Summary, o MongoDB Compass exibe os estágios de consulta
FETCHeIXSCAN.IXSCANindica que omongodusou um índice para satisfazer a consulta antes de executar o estágioFETCHe recuperar os documentos.
Raw JSON
Os detalhes explicativos também podem ser visualizados no formato JSON bruto clicando em Raw JSON abaixo da barra de consulta:

Sem o índice, a query verificaria toda a collection de 10 documentos para retornar 3 documentos correspondentes. A query também precisou verificar a totalidade de cada documento, potencialmente colocando-os na memória. Isso resulta em uma operação de query cara e potencialmente lenta.
Ao executar com um índice, a query verificou 3 entradas de índice e 3 documentos para retornar 3 documentos correspondentes, resultando em uma query muito eficiente.
Comparar Desempenho dos Índices
Para comparar manualmente o desempenho de uma consulta usando mais de um índice, você pode usar o método em hint() explain() conjunto com o método.
Considere a seguinte query:
db.inventory.find( { quantity: { $gte: 100, $lte: 300 }, type: "food" } )
A consulta retorna os seguintes documentos:
{ "_id" : 2, "item" : "f2", "type" : "food", "quantity" : 100 } { "_id" : 5, "item" : "f3", "type" : "food", "quantity" : 300 }
Para dar suporte à consulta, adicione um índice composto. Com índices compostos, a ordem dos campos é importante.
Por exemplo, adicione os dois índices compostos a seguir. O primeiro índice ordena primeiro pelo campo quantity e depois pelo campo type. O segundo índice ordena primeiro por type e, em seguida, pelo campo quantity.
db.inventory.createIndex( { quantity: 1, type: 1 } ) db.inventory.createIndex( { type: 1, quantity: 1 } )
Avalie o efeito do primeiro índice na query:
db.inventory.find( { quantity: { $gte: 100, $lte: 300 }, type: "food" } ).hint({ quantity: 1, type: 1 }).explain("executionStats")
O método explain() retorna a seguinte saída:
{ queryPlanner: { ... winningPlan: { queryPlan: { stage: 'FETCH', inputStage: { stage: 'IXSCAN', keyPattern: { quantity: 1, type: 1 }, ... } } } }, rejectedPlans: [ ] }, executionStats: { executionSuccess: true, nReturned: 2, executionTimeMillis: 0, totalKeysExamined: 5, totalDocsExamined: 2, executionStages: { ... } }, ... }
O MongoDB escaneou 5 chaves de índice (executionStats.totalKeysExamined) para retornar 2 documentos correspondentes (executionStats.nReturned).
Avalie o efeito do segundo índice na query:
db.inventory.find( { quantity: { $gte: 100, $lte: 300 }, type: "food" } ).hint({ type: 1, quantity: 1 }).explain("executionStats")
O método explain() retorna a seguinte saída:
{ queryPlanner: { ... queryPlan: { winningPlan: { stage: 'FETCH', inputStage: { stage: 'IXSCAN', keyPattern: { type: 1, quantity: 1 }, ... } } }, rejectedPlans: [ ] }, executionStats: { executionSuccess: true, nReturned: 2, executionTimeMillis: 0, totalKeysExamined: 2, totalDocsExamined: 2, executionStages: { ... } }, ... }
O MongoDB escaneou 2 chaves de índice (executionStats.totalKeysExamined) para retornar 2 documentos correspondentes (executionStats.nReturned).
O segundo índice composto, { type: 1, quantity: 1 }, é, portanto, o índice mais eficiente para dar suporte à consulta de exemplo, pois o servidor MongoDB só precisa escanear 2 index keys para encontrar todos os documentos correspondentes usando esse índice, em comparação com 5 ao usar o índice composto { quantity: 1, type: 1 }.