MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Cadre d'explication de Mongodb pour l'agrégation

À 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"