À 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' 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 indice ne peut être utilisé pour récupérer les données initiales pour un pipeline (par exemple l' utilisation de $match
, $sort
, $geonear
au début d'un pipeline), ainsi que la suite $lookup
et 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' allowDiskUse
option 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
, $limit
et $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' explain
option 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 executionStats
mode 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 executionStats
ou de la allPlansExecution
verbosité .
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: