Puedes usar los resultados de 'explain' para determinar la siguiente información sobre una consulta:
La cantidad de tiempo que tardó en completarse una query
Si la query usó o no un índice.
El número de documentos y claves de índice escaneados para cumplir con una query
Nota
Los resultados del plan de explicación para las consultas están sujetos a cambios entre las versiones de MongoDB.
Los métodos cursor.explain("executionStats") y db.collection.explain("executionStats") proporcionan estadísticas sobre el rendimiento de una consulta. Estas estadísticas pueden ser útiles para medir si una consulta utiliza un índice y cómo lo hace. Consulta db.collection.explain() para más detalles.
Evaluar el rendimiento de una query
Los ejemplos de esta página utilizan datos del conjunto de datos de muestra sample_mflix. Para obtener más información sobre cómo cargar este conjunto de datos en la implementación autogestionada de MongoDB, consultar Cargar el conjunto de datos de muestra. Si se realizó alguna modificación en las bases de datos de muestra, es posible que se deban descartar y volver a crear las bases de datos para ejecutar los ejemplos de esta página.
Los ejemplos de esta página utilizan datos del conjunto de datos de ejemplo sample_mflix. Para obtener más información sobre cómo cargar este conjunto de datos en su implementación, consulte Importar datos de ejemplo en su implementación de Atlas.
Después de cargar el conjunto de datos, conecte MongoDB Compass a la misma implementación y abra la colección movies.
Los documentos de la colección aparecen en MongoDB Compass de la siguiente manera:

query sin índice
La siguiente query recupera documentos donde el campo year tiene un valor entre 2000 y 2005, inclusivo:
db.movies.find( { year: { $gte: 2000, $lte: 2005 } } )
Esta consulta coincide con 3809 de los 21349 documentos de la colección.
Para ver el plan del query seleccionado, encadena el método cursor cursor.explain("executionStats") al final del comando find:
db.movies.find( { year: { $gte: 2000, $lte: 2005 } } ).explain("executionStats")
{ queryPlanner: { namespace: 'sample_mflix.movies', winningPlan: { stage: 'COLLSCAN', '...': '...' }, '...': '...' }, executionStats: { executionSuccess: true, nReturned: 3809, totalKeysExamined: 0, totalDocsExamined: 21349, executionStages: { stage: 'COLLSCAN', '...': '...' }, '...': '...' }, '...': '...' }
queryPlanner.winningPlan.stagemuestraCOLLSCANpara indicar un escaneo de colección.El escaneo de colección indica que la
mongodtuvo que escanear toda la colección documento por documento para identificar los resultados. Esta es una operación generalmente costosa y puede resultar en consultas lentas.executionStats.nReturnedmuestra3809para indicar que el plan de consulta ganador devuelve 3,809 documentos.executionStats.totalKeysExaminedmuestra0para indicar que esta consulta no está utilizando un índice.executionStats.totalDocsExaminedmuestra21349para indicar que MongoDB tuvo que escanear todos los documentos 21,349 de la colección para encontrar los documentos coincidentes 3,809.
La siguiente query recupera documentos donde el campo year tiene un valor entre 2000 y 2005, inclusivo:
Copia el siguiente filtro en la barra de query de Compass y haz clic en Find:
{ year: { $gte: 2000, $lte: 2005 } }
Esta consulta coincide con 3809 de los 21349 documentos de la colección.
Para ver el plan de consulta, haga clic en Explain en la barra de consulta.
MongoDB Compass muestra el plan del query de la siguiente manera:

Árbol visual
El Query Performance Summary muestra las estadísticas de ejecución de la consulta:
Documents Returned Muestra
3809para indicar que el plan de consulta ganador devuelve los documentos 3,809.Documents Examined Muestra
21349para indicar que MongoDB tuvo que escanear todos los documentos 21,349 de la colección para encontrar los documentos coincidentes 3,809.Index Keys Examined muestra
0para indicar que esta consulta no está usando un índice.
MongoDB Compass muestra la etapa de consulta
COLLSCANpara indicar que se utilizó un escaneo de colección para esta consulta. Los escaneos de colección indican quemongodtuvo que escanear toda la colección documento por documento para identificar los resultados. Esta es una operación generalmente costosa y puede resultar en consultas lentas.
Raw JSON
Los detalles de Explain Plan también se pueden ver en formato JSON sin procesar haciendo clic en la opción Raw Output:

La diferencia entre el número de documentos coincidentes y el número de documentos examinados puede sugerir que la consulta podría beneficiarse del uso de un índice para mejorar la eficiencia.
query con índice
Para admitir la query en el campo year, añada un índice en el campo year:
db.movies.createIndex( { year: 1 } )
Para ver las estadísticas del plan del query, utiliza el método explain():
db.movies.find( { year: { $gte: 2000, $lte: 2005 } } ).explain("executionStats")
{ queryPlanner: { namespace: 'sample_mflix.movies', winningPlan: { stage: 'FETCH', inputStage: { stage: 'IXSCAN', keyPattern: { year: 1 }, '...': '...' }, '...': '...' }, '...': '...' }, executionStats: { executionSuccess: true, nReturned: 3809, totalKeysExamined: 3809, totalDocsExamined: 3809, '...': '...' }, '...': '...' }
queryPlanner.winningPlan.inputStage.stagemuestraIXSCANpara indicar el uso del índice.executionStats.nReturnedmuestra3809para indicar que el plan de consulta ganador devuelve 3,809 documentos.executionStats.totalKeysExaminedmuestra3809para indicar que MongoDB analizó 3,809 entradas de índice. El número de claves examinadas coincide con el número de documentos devueltos, lo que significa quemongodsolo tuvo que examinar las claves de índice para devolver los resultados.mongodno tuvo que analizar todos los documentos, y solo los documentos coincidentes 3,809 tuvieron que cargarse en memoria. Esto da como resultado una consulta muy eficiente.executionStats.totalDocsExaminedmuestra3809para indicar que MongoDB escaneó los documentos 3,809.
Para admitir la query en el campo year, añada un índice en el campo year:
Haz clic en la pestaña Indexes para la colección
sample_mflix.movies.Haz clic en Create y luego selecciona Index en el menú desplegable.
Selecciona
yeardel menú desplegable Select or type a field name.Selecciona
1 (asc)del menú desplegable Select a type.Haga clic en Create Index.
Nota
Si se deja en blanco el campo de nombre del índice, MongoDB Compass crea un nombre por defecto para el índice.
Ahora puedes ver tu índice recién creado en la pestaña Indexes:

Vuelve a la pestaña Documents para la colección sample_mflix.movies y vuelve a ejecutar la consulta del paso anterior:
{ year: { $gte: 2000, $lte: 2005 } }
Abra la ventana modal Explain Plan. MongoDB Compass muestra el plan de consulta de la siguiente manera:

Árbol visual
El Query Performance Summary muestra las estadísticas de ejecución de la consulta:
Documents Returned Muestra
3809para indicar que el plan de consulta ganador devuelve los documentos 3,809.Documents Examined muestra
3809para indicar que MongoDB escaneó los documentos 3,809.Index Keys Examined Muestra
3809para indicar que MongoDB analizó las entradas del índice 3 y 809. El número de claves examinadas coincide con el número de documentos devueltos, lo que significa quemongodsolo tuvo que examinar las claves del índice para devolver los resultados.mongodno tuvo que analizar todos los documentos, y solo se cargaron en memoria los documentos coincidentes 3 y 809. Esto da como resultado una consulta muy eficiente.En la parte inferior de Query Performance Summary, MongoDB Compass muestra que la consulta utilizó el índice
year.
A la izquierda de Query Performance Summary, MongoDB Compass muestra las etapas de consulta
FETCHyIXSCAN.IXSCANindica quemongodutilizó un índice para satisfacer la consulta antes de ejecutar la etapaFETCHy recuperar los documentos.
Raw JSON
Los detalles de la explicación también se pueden ver en formato JSON sin procesar haciendo clic en la opción Raw Output:

Sin el índice, la consulta recorre toda la colección para devolver los documentos coincidentes. Además, debe examinar cada documento por completo, lo que puede implicar cargarlos en memoria. Esto resulta en una operación de consulta costosa y potencialmente lenta.
Cuando se ejecuta con un índice, la consulta solo examina la cantidad de entradas de índice y documentos que devuelve, lo que da como resultado una consulta más eficiente.
Comparar el funcionamiento de los índices
Para comparar manualmente el rendimiento de una query utilizando más de un índice, puedes utilizar el hint() método junto con el explain() método.
Considera el siguiente query:
db.movies.find( { year: { $gte: 2000, $lte: 2005 }, rated: "PG" } )
Esta consulta coincide con los documentos 235.
Para respaldar la query, agregue un índice compuesto. Con los índices compuestos, el orden de los campos es importante.
Por ejemplo, añade los siguientes dos índices compuestos. El primer índice ordena primero por el campo year y luego por el campo rated. El segundo índice ordena primero por rated y luego por el campo year.
db.movies.createIndex( { year: 1, rated: 1 } ) db.movies.createIndex( { rated: 1, year: 1 } )
Evalúa el efecto del primer índice en la query:
db.movies.find( { year: { $gte: 2000, $lte: 2005 }, rated: "PG" } ).hint( { year: 1, rated: 1 } ).explain("executionStats")
{ queryPlanner: { namespace: 'sample_mflix.movies', winningPlan: { stage: 'FETCH', inputStage: { stage: 'IXSCAN', keyPattern: { year: 1, rated: 1 }, '...': '...' }, '...': '...' }, '...': '...' }, executionStats: { executionSuccess: true, nReturned: 235, totalKeysExamined: 246, totalDocsExamined: 235, '...': '...' }, '...': '...' }
MongoDB analizó 246 claves del índice (executionStats.totalKeysExamined) para devolver 235 documentos coincidentes (executionStats.nReturned).
Evaluar el efecto del segundo índice en la query:
db.movies.find( { year: { $gte: 2000, $lte: 2005 }, rated: "PG" } ).hint( { rated: 1, year: 1 } ).explain("executionStats")
{ queryPlanner: { namespace: 'sample_mflix.movies', winningPlan: { stage: 'FETCH', inputStage: { stage: 'IXSCAN', keyPattern: { rated: 1, year: 1 }, '...': '...' }, '...': '...' }, '...': '...' }, executionStats: { executionSuccess: true, nReturned: 235, totalKeysExamined: 235, totalDocsExamined: 235, '...': '...' }, '...': '...' }
MongoDB analizó 235 claves del índice (executionStats.totalKeysExamined) para devolver 235 documentos coincidentes (executionStats.nReturned).
Por lo tanto, el segundo índice compuesto, { rated: 1, year: 1 }, es el índice más eficiente para admitir la consulta de ejemplo, ya que el servidor MongoDB solo necesita escanear 235 index keys para encontrar todos los documentos coincidentes usando este índice, en comparación con 246 cuando se usa el índice compuesto { year: 1, rated: 1 }.