A partir do MongoDB versão 3.0, basta alterar a ordem de
collection.aggregate(...).explain()
para
collection.explain().aggregate(...)
fornecerá os resultados desejados (documentação aqui ).
Para versões mais antigas> = 2.6, você precisará usar a explainopção para operações de pipeline de agregação
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
}
)
Uma consideração importante com o Quadro A agregação é um índice que só pode ser usado para obter os dados iniciais de um oleoduto (por exemplo, o uso de $match, $sort, $geonearno início de um oleoduto), bem como subsequente $lookupe $graphLookupfases. Uma vez que os dados tenham sido buscados no pipeline de agregação para processamento (por exemplo, passando por estágios como $project, $unwinde $group), a manipulação adicional estará na memória (possivelmente usando arquivos temporários se a allowDiskUseopção for definida).
Otimizando pipelines
Em geral, você pode otimizar pipelines de agregação por:
- Iniciar um pipeline com um
$matchestágio para restringir o processamento de documentos relevantes.
- Assegurar as iniciais
$match/ $sortfases são suportados por um índice eficiente .
- Filtrando dados cedo usando
$match, $limite $skip.
- Minimizando estágios desnecessários e manipulação de documentos (talvez reconsiderando seu esquema se uma complicada ginástica de agregação for necessária).
- Aproveitando os novos operadores de agregação se você atualizou seu servidor MongoDB. Por exemplo, MongoDB 3.4 adicionou muitos novos estágios de agregação e expressões, incluindo suporte para trabalhar com arrays, strings e facetas.
Também há várias otimizações de pipeline de agregação que acontecem automaticamente, dependendo da versão do servidor MongoDB. Por exemplo, estágios adjacentes podem ser coalescidos e / ou reordenados para melhorar a execução sem afetar os resultados de saída.
Limitações
Como no MongoDB 3.4, a explainopção Aggregation Framework fornece informações sobre como um pipeline é processado, mas não oferece suporte ao mesmo nível de detalhe que o executionStatsmodo para uma find()consulta. Se você estiver focado na otimização da execução inicial da consulta, provavelmente achará benéfico revisar a find().explain()consulta equivalente com executionStatsou allPlansExecutiondetalhamento .
Existem algumas solicitações de recursos relevantes para observar / votar no rastreador de problemas do MongoDB em relação a estatísticas de execução mais detalhadas para ajudar a otimizar / canais de agregação de perfil: