A partire da MongoDB versione 3.0, cambiando semplicemente l'ordine da
collection.aggregate(...).explain()
per
collection.explain().aggregate(...)
ti darà i risultati desiderati (documentazione qui ).
Per le versioni precedenti> = 2.6, sarà necessario utilizzare l' explainopzione per le operazioni della pipeline di aggregazione
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 considerazione importante con il quadro di aggregazione è che un indice può essere utilizzato solo per recuperare i dati iniziali per una tubazione (ad esempio l'utilizzo di $match, $sort, $geonearall'inizio di una pipeline), così come la successiva $lookupe $graphLookupstadi. Una volta che i dati sono stati recuperati nella pipeline di aggregazione per l'elaborazione (ad esempio passando attraverso fasi come $project, $unwinde $group), un'ulteriore manipolazione sarà in memoria (possibilmente utilizzando file temporanei se l' allowDiskUseopzione è impostata).
Ottimizzazione delle pipeline
In generale, puoi ottimizzare le pipeline di aggregazione:
- Avvio di una pipeline con una
$matchfase per limitare l'elaborazione ai documenti pertinenti.
- Garantire che le fasi iniziali
$match/ $sortsiano supportate da un indice efficiente .
- Filtraggio dei dati in anticipo utilizzando
$match, $limite $skip.
- Ridurre al minimo le fasi non necessarie e la manipolazione dei documenti (magari riconsiderando il proprio schema se sono necessarie complicate ginnastica di aggregazione).
- Approfittando dei nuovi operatori di aggregazione se hai aggiornato il tuo server MongoDB. Ad esempio, MongoDB 3.4 ha aggiunto molte nuove fasi ed espressioni di aggregazione, incluso il supporto per lavorare con array, stringhe e facet.
Esistono anche una serie di ottimizzazioni della pipeline di aggregazione che vengono eseguite automaticamente a seconda della versione del server MongoDB. Ad esempio, gli stadi adiacenti possono essere uniti e / o riordinati per migliorare l'esecuzione senza influenzare i risultati di output.
limitazioni
Come in MongoDB 3.4, l' explainopzione Aggregation Framework fornisce informazioni su come viene elaborata una pipeline ma non supporta lo stesso livello di dettaglio della executionStatsmodalità per una find()query. Se ti concentri sull'ottimizzazione dell'esecuzione della query iniziale, probabilmente troverai utile rivedere la find().explain()query equivalente con executionStatso allPlansExecutionverbosity .
Ci sono alcune richieste di funzionalità rilevanti da guardare / votare a favore nel tracker dei problemi di MongoDB per quanto riguarda statistiche di esecuzione più dettagliate per aiutare a ottimizzare / profilare le pipeline di aggregazione: