À partir de la version 3.0 de MongoDB, il suffit de changer l'ordre de l'option
collection.aggregate(...).explain()
à
collection.explain().aggregate(...)
vous donnera les résultats souhaités (documentation aquí ).
Pour les versions antérieures >= 2.6, vous devrez utiliser la fonction 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
}
)
Un point important à prendre en compte 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 la fonction $match
, $sort
, $geonear
au début d'un pipeline) ainsi que les suivants $lookup
et $graphLookup
étapes. Une fois que les données ont été récupérées dans le pipeline d'agrégation pour être traitées (par exemple en passant par des étapes telles que $project
, $unwind
et $group
), les manipulations ultérieures se feront en mémoire (en utilisant éventuellement des fichiers temporaires si l'option allowDiskUse
est définie).
Optimisation des pipelines
En général, vous pouvez optimiser les pipelines d'agrégation en :
- Démarrer un pipeline avec un
$match
pour limiter le traitement aux documents pertinents.
- Veiller à ce que les
$match
/ $sort
sont soutenus par une indice efficace .
- Filtrage précoce des données à l'aide de
$match
, $limit
et $skip
.
- Réduire au minimum les étapes et les manipulations de documents inutiles (peut-être en reconsidérant votre schéma si des gymnastiques d'agrégation compliquées sont nécessaires).
- Profiter des nouveaux opérateurs d'agrégation si vous avez mis à jour votre serveur MongoDB. Par exemple, la version 3.4 de MongoDB a ajouté de nombreux opérateurs d'agrégation. de nouvelles étapes et expressions d'agrégation y compris la prise en charge du travail avec les tableaux, les chaînes de caractères et les facettes.
Il existe également un certain nombre de Optimisations du pipeline d'agrégation qui se produisent automatiquement en fonction de la version de votre serveur MongoDB. Par exemple, des étapes adjacentes peuvent être regroupées et/ou réorganisées pour améliorer l'exécution sans affecter les résultats de sortie.
Limites
À partir de MongoDB 3.4, le Cadre d'agrégation explain
fournit des informations sur la façon dont un pipeline est traité mais ne permet pas le même niveau de détail que l'option executionStats
pour un find()
question. Si vous vous concentrez sur l'optimisation de l'exécution initiale de la requête, vous trouverez probablement avantageux d'examiner les équivalents suivants find().explain()
la requête avec executionStats
o allPlansExecution
verbosité .
Il y a quelques demandes de fonctionnalités pertinentes à suivre/supprimer dans le tracker de problèmes MongoDB concernant des statistiques d'exécution plus détaillées pour aider à optimiser/profiler les pipelines d'agrégation :