Comenzando con MongoDB versión 3.0, simplemente cambiando el orden de
collection.aggregate(...).explain()
a
collection.explain().aggregate(...)
le dará los resultados deseados (documentación aquí ).
Para versiones anteriores> = 2.6, deberá usar la explain
opción para operaciones de canalización de agregación
explain:true
db.collection.aggregate([
{ $project : { "Tags._id" : 1 }},
{ $unwind : "$Tags" },
{ $match: {$or: [{"Tags._id":"tag1"},{"Tags._id":"tag2"}]}},
{ $group: {
_id : "$_id",
count: { $sum:1 }
}},
{$sort: {"count":-1}}
],
{
explain:true
}
)
Una consideración importante con el Marco agregación es que un índice sólo se puede utilizar para recuperar los datos iniciales para una tubería (por ejemplo, el uso de $match
, $sort
, $geonear
al comienzo de una tubería), así como la posterior $lookup
y $graphLookup
etapas. Una vez que los datos se han recuperado en la tubería de agregación para su procesamiento (por ejemplo, pasando por etapas como $project
, $unwind
y $group
) la manipulación adicional estará en la memoria (posiblemente usando archivos temporales si la allowDiskUse
opción está configurada).
Optimización de tuberías
En general, puede optimizar las canalizaciones de agregación mediante:
- Iniciar una canalización con una
$match
etapa para restringir el procesamiento a los documentos relevantes.
- Asegurar las iniciales
$match
/ $sort
etapas están soportados por un índice eficiente .
- Filtrado de datos utilizando principios
$match
, $limit
y $skip
.
- Minimizar las etapas innecesarias y la manipulación de documentos (quizás reconsiderar su esquema si se requieren gimnasia de agregación complicada).
- Aprovechando los operadores de agregación más nuevos si ha actualizado su servidor MongoDB. Por ejemplo, MongoDB 3.4 agregó muchas etapas y expresiones de agregación nuevas, incluida la compatibilidad para trabajar con matrices, cadenas y facetas.
También hay una serie de optimizaciones de canalización de agregación que ocurren automáticamente según la versión de su servidor MongoDB. Por ejemplo, las etapas adyacentes pueden fusionarse y / o reordenarse para mejorar la ejecución sin afectar los resultados de salida.
Limitaciones
Como en MongoDB 3.4, la explain
opción Aggregation Framework proporciona información sobre cómo se procesa una canalización, pero no admite el mismo nivel de detalle que el executionStats
modo de una find()
consulta. Si está enfocado en optimizar la ejecución de la consulta inicial, probablemente le resultará beneficioso revisar la find().explain()
consulta equivalente con executionStats
o allPlansExecution
verbosidad .
Hay algunas solicitudes de funciones relevantes para ver / votar en el rastreador de problemas de MongoDB con respecto a estadísticas de ejecución más detalladas para ayudar a optimizar / perfilar las canalizaciones de agregación: