A partir do MongoDB versão 3.0, simplesmente alterando a ordem de
collection.aggregate(...).explain()
para
collection.explain().aggregate(...)
lhe dará os resultados desejados (documentação aqui).
Para versões mais antigas>=2.6, você precisará usar o
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 Aggregation Framework é que um índice só pode ser usado para buscar os dados iniciais de um pipeline (por exemplo, uso de
$match
, $sort
, $geonear
no início de um pipeline), bem como o $lookup
subsequente e $graphLookup
estágios. Depois que os dados forem buscados no pipeline de agregação para processamento (por exemplo, passando por estágios como $project
, $unwind
e $group
) manipulação adicional será na memória (possivelmente usando arquivos temporários se o allowDiskUse
opção está definida). Otimização de pipelines
Em geral, você pode otimizar pipelines de agregação:
- Iniciando um pipeline com um
$match
etapa para restringir o processamento a documentos relevantes. - Garantindo o
$match
inicial /$sort
estágios são suportados por um índice eficiente. - Filtrar dados antecipadamente usando
$match
,$limit
e$skip
. - Minimizando etapas desnecessárias e manipulação de documentos (talvez reconsiderando seu esquema se forem necessárias ginásticas de agregação complicadas).
- Aproveitando os operadores de agregação mais recentes se você atualizou seu servidor MongoDB. Por exemplo, o MongoDB 3.4 adicionou muitos novos estágios e expressões de agregação, incluindo suporte para trabalhar com arrays, strings e facetas.
Há também uma série de Otimizações de Pipeline de Agregação que acontecem automaticamente dependendo da versão do seu servidor MongoDB. Por exemplo, estágios adjacentes podem ser agrupados e/ou reordenados para melhorar a execução sem afetar os resultados de saída.
Limitações
Como no MongoDB 3.4, o Aggregation Framework
explain
A opção fornece informações sobre como um pipeline é processado, mas não oferece suporte ao mesmo nível de detalhes que o executionStats
modo para um find()
inquerir. Se você estiver focado em otimizar a execução da consulta inicial, provavelmente achará benéfico revisar o equivalente find().explain()
consulta com executionStats
ou allPlansExecution
verbosidade. Existem algumas solicitações de recursos relevantes para assistir/aprovar no rastreador de problemas do MongoDB em relação a estatísticas de execução mais detalhadas para ajudar a otimizar/perfil de pipelines de agregação:
- SERVER-19758:adicione os modos de explicação "executionStats" e "allPlansExecution" à explicação de agregação
- SERVER-21784:acompanhe as estatísticas de execução para cada estágio do pipeline de agregação e exponha por meio de explicação
- SERVER-22622:Melhore a explicação de $lookup para indicar o plano de consulta na coleção "de"