A partire da MongoDB versione 3.0, semplicemente cambiando l'ordine da
collection.aggregate(...).explain()
a
collection.explain().aggregate(...)
ti darà i risultati desiderati (documentazione qui).
Per le versioni precedenti>=2.6, dovrai utilizzare explain
opzione per operazioni di 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 Aggregation Framework è che un indice può essere utilizzato solo per recuperare i dati iniziali per una pipeline (ad es. utilizzo di $match
, $sort
, $geonear
all'inizio di una pipeline) e il successivo $lookup
e $graphLookup
fasi. Una volta che i dati sono stati recuperati nella pipeline di aggregazione per l'elaborazione (ad es. passando attraverso fasi come $project
, $unwind
e $group
) ulteriori manipolazioni saranno in memoria (possibilmente utilizzando file temporanei se allowDiskUse
l'opzione è impostata).
Ottimizzazione delle pipeline
In generale, puoi ottimizzare le pipeline di aggregazione:
- Avvio di una pipeline con un
$match
fase per limitare l'elaborazione ai documenti pertinenti. - Garantire la
$match
iniziale /$sort
le fasi sono supportate da un efficiente indice. - Filtraggio anticipato dei dati utilizzando
$match
,$limit
e$skip
. - Ridurre al minimo le fasi non necessarie e la manipolazione dei documenti (magari riconsiderando il tuo schema se sono necessarie complicate ginnastica di aggregazione).
- Sfruttando i 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.
Ci sono anche una serie di ottimizzazioni della pipeline di aggregazione che si verificano automaticamente a seconda della versione del server MongoDB. Ad esempio, le fasi adiacenti possono essere unite e/o riordinate per migliorare l'esecuzione senza influire sui risultati di output.
Limiti
Come in MongoDB 3.4, il Framework di aggregazione explain
l'opzione fornisce informazioni su come viene elaborata una pipeline ma non supporta lo stesso livello di dettaglio di executionStats
modalità per un find()
interrogazione. Se ti concentri sull'ottimizzazione dell'esecuzione iniziale della query, probabilmente troverai utile rivedere l'equivalente find().explain()
interrogare con executionStats
o allPlansExecution
verbosità.
Ci sono alcune richieste di funzionalità rilevanti da guardare/votare nel tracker dei problemi di MongoDB riguardo a statistiche di esecuzione più dettagliate per aiutare a ottimizzare/profilare le pipeline di aggregazione:
- SERVER-19758:Aggiungi "executionStats" e "allPlansExecution" spiegano le modalità per spiegare l'aggregazione
- SERVER-21784:traccia le statistiche di esecuzione per ogni fase della pipeline di aggregazione ed esponi tramite spiegare
- SERVER-22622:Migliora la spiegazione di $lookup per indicare il piano di query nella raccolta "da"