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 explain
opçã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
, $geonear
no início de um oleoduto), bem como subsequente $lookup
e $graphLookup
fases. Uma vez que os dados tenham sido buscados no pipeline de agregação para processamento (por exemplo, passando por estágios como $project
, $unwind
e $group
), a manipulação adicional estará na memória (possivelmente usando arquivos temporários se a allowDiskUse
opção for definida).
Otimizando pipelines
Em geral, você pode otimizar pipelines de agregação por:
- Iniciar um pipeline com um
$match
estágio para restringir o processamento de documentos relevantes.
- Assegurar as iniciais
$match
/ $sort
fases são suportados por um índice eficiente .
- Filtrando dados cedo usando
$match
, $limit
e $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 explain
opção Aggregation Framework fornece informações sobre como um pipeline é processado, mas não oferece suporte ao mesmo nível de detalhe que o executionStats
modo 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 executionStats
ou allPlansExecution
detalhamento .
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: