À partir de la version 3.0 de MongoDB, il suffit de changer l'ordre de
collection.aggregate(...).explain()
à
collection.explain().aggregate(...)
vous donnera les résultats souhaités (documentation ici).
Pour les anciennes versions>=2.6, vous devrez utiliser le explain
option 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 index ne peut être utilisé que pour récupérer les données initiales d'un pipeline (par exemple, l'utilisation de $match
, $sort
, $geonear
au début d'un pipeline) ainsi que les $lookup
suivants et $graphLookup
étapes. Une fois que les données ont été récupérées dans le pipeline d'agrégation pour traitement (par exemple, en passant par des étapes telles que $project
, $unwind
, et $group
) d'autres manipulations seront en mémoire (éventuellement en utilisant des fichiers temporaires si le allowDiskUse
l'option est définie).
Optimiser les pipelines
En général, vous pouvez optimiser les pipelines d'agrégation en :
- Démarrer un pipeline avec un
$match
étape pour limiter le traitement aux documents pertinents. - Assurer le
$match
initial /$sort
les étapes sont soutenues par un index efficace. - Filtrer les données en amont à l'aide de
$match
,$limit
, et$skip
. - Minimiser les étapes inutiles et la manipulation de documents (peut-être en reconsidérant votre schéma si une gymnastique d'agrégation compliquée est nécessaire).
- Profitez des nouveaux opérateurs d'agrégation si vous avez mis à niveau votre serveur MongoDB. Par exemple, MongoDB 3.4 a ajouté de nombreuses nouvelles étapes et expressions d'agrégation, notamment la prise en charge de l'utilisation de tableaux, de chaînes et de facettes.
Il existe également un certain nombre d'optimisations du pipeline d'agrégation qui se produisent automatiquement en fonction de la version de votre serveur MongoDB. Par exemple, les étapes adjacentes peuvent être fusionnées et/ou réorganisées pour améliorer l'exécution sans affecter les résultats de sortie.
Limites
Comme dans MongoDB 3.4, le cadre d'agrégation explain
L'option 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 executionStats
mode pour un find()
requête. Si vous vous concentrez sur l'optimisation de l'exécution de la requête initiale, vous trouverez probablement utile de revoir l'équivalent find().explain()
requête avec executionStats
ou allPlansExecution
verbosité.
Il existe quelques demandes de fonctionnalités pertinentes à surveiller/voter dans le suivi des problèmes MongoDB concernant des statistiques d'exécution plus détaillées pour aider à optimiser/profiler les pipelines d'agrégation :
- SERVER-19758 :Ajout des modes d'explication "executionStats" et "allPlansExecution" à l'explication d'agrégation
- SERVER-21784 :suivez les statistiques d'exécution pour chaque étape du pipeline d'agrégation et exposez-les via expliquer
- SERVER-22622 :Améliorez l'explication de $lookup pour indiquer le plan de requête sur la collection "de"