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' explain
opzione 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
, $geonear
all'inizio di una pipeline), così come la successiva $lookup
e $graphLookup
stadi. Una volta che i dati sono stati recuperati nella pipeline di aggregazione per l'elaborazione (ad esempio passando attraverso fasi come $project
, $unwind
e $group
), un'ulteriore manipolazione sarà in memoria (possibilmente utilizzando file temporanei se l' allowDiskUse
opzione è impostata).
Ottimizzazione delle pipeline
In generale, puoi ottimizzare le pipeline di aggregazione:
- Avvio di una pipeline con una
$match
fase per limitare l'elaborazione ai documenti pertinenti.
- Garantire che le fasi iniziali
$match
/ $sort
siano supportate da un indice efficiente .
- Filtraggio dei dati in anticipo utilizzando
$match
, $limit
e $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' explain
opzione Aggregation Framework fornisce informazioni su come viene elaborata una pipeline ma non supporta lo stesso livello di dettaglio della executionStats
modalità per una find()
query. Se ti concentri sull'ottimizzazione dell'esecuzione della query iniziale, probabilmente troverai utile rivedere la find().explain()
query equivalente con executionStats
o allPlansExecution
verbosity .
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: