À partir de MongoDB version 3.0, il suffit de changer l'ordre de
collection.aggregate(...).explain()
à
collection.explain().aggregate(...)
vous donnera les résultats souhaités (documentation ici ).
Pour les versions antérieures> = 2.6, vous devrez utiliser l' explainoption pour les opérations de pipeline d'agrégation
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
}
)
Une considération importante avec le Cadre d' agrégation est qu'un indice ne peut être utilisé pour récupérer les données initiales pour un pipeline (par exemple l' utilisation de $match, $sort, $geonearau début d'un pipeline), ainsi que la suite $lookupet les $graphLookupétapes. Une fois que les données ont été récupérées dans la canalisation d'agrégation pour le traitement (par exemple en passant par les étapes comme $project, $unwind, et $group) une manipulation supplémentaire sera en mémoire (éventuellement en utilisant des fichiers temporaires si l' allowDiskUseoption est réglée).
Optimiser les pipelines
En général, vous pouvez optimiser les pipelines d'agrégation en:
- Démarrage d'un pipeline avec une
$matchétape pour limiter le traitement aux documents pertinents.
- Assurer les premiers
$match/ $sortétapes sont prises en charge par un indice efficace .
- Filtrage des données à l' aide précoce
$match, $limitet $skip.
- Minimiser les étapes inutiles et la manipulation de documents (peut-être reconsidérer votre schéma si une gymnastique d'agrégation compliquée est nécessaire).
- Tirer parti des opérateurs d'agrégation plus récents si vous avez mis à niveau votre serveur MongoDB. Par exemple, MongoDB 3.4 a ajouté de nombreuses nouvelles étapes et expressions d'agrégation, y compris la prise en charge de l'utilisation de tableaux, de chaînes et de facettes.
Il existe également un certain nombre d' optimisations de pipeline d'agrégation qui se produisent automatiquement en fonction de la version de votre serveur MongoDB. Par exemple, les étages adjacents peuvent être fusionnés et / ou réorganisés pour améliorer l'exécution sans affecter les résultats de sortie.
Limites
Comme dans MongoDB 3.4, l' explainoption Aggregation Framework fournit des informations sur la façon dont un pipeline est traité mais ne prend pas en charge le même niveau de détail que le executionStatsmode d'une find()requête. Si vous vous concentrez sur l'optimisation de l'exécution de la requête initiale, vous trouverez probablement utile de passer en revue la find().explain()requête équivalente avec executionStatsou de la allPlansExecutionverbosité .
Il existe quelques demandes de fonctionnalités pertinentes à surveiller / à voter dans le suivi des problèmes de MongoDB concernant des statistiques d'exécution plus détaillées pour aider à optimiser / profiler les pipelines d'agrégation: