Ab MongoDB Version 3.0 ändern Sie einfach die Reihenfolge von
collection.aggregate(...).explain()
zu
collection.explain().aggregate(...)
erhalten Sie die gewünschten Ergebnisse (Dokumentation hier ).
Für ältere Versionen> = 2.6 müssen Sie die explainOption für Aggregationspipeline-Operationen verwenden
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
}
)
Eine wichtige Überlegung bei der Aggregation Framework ist , dass ein Index kann nur die Ausgangsdaten für eine Rohrleitung (zB Verwendung von holen verwendet werden $match, $sort, $geonearam Anfang einer Rohrleitung) sowie anschließende $lookupund $graphLookupStufen. Sobald die Daten zur Verarbeitung abgerufen in die Aggregations Pipeline wurden (zB der durch Stufen wie $project, $unwind, und $group) weitere Manipulation in-Speicher sein (möglicherweise unter Verwendung von temporären Dateien , wenn die allowDiskUseOption gesetzt ist).
Pipelines optimieren
Im Allgemeinen können Sie Aggregations-Pipelines optimieren, indem Sie:
- Starten einer Pipeline mit einer
$matchPhase, um die Verarbeitung auf relevante Dokumente zu beschränken.
- Sicherstellen, dass die Anfangs-
$match/ $sortPhasen durch einen effizienten Index unterstützt werden .
- Filtern von Daten früh mit
$match, $limitund $skip.
- Minimierung unnötiger Phasen und Manipulation von Dokumenten (möglicherweise Überdenken Ihres Schemas, wenn komplizierte Aggregationsgymnastik erforderlich ist).
- Nutzen Sie neuere Aggregationsoperatoren, wenn Sie Ihren MongoDB-Server aktualisiert haben. In MongoDB 3.4 wurden beispielsweise viele neue Aggregationsstufen und Ausdrücke hinzugefügt, einschließlich der Unterstützung für die Arbeit mit Arrays, Zeichenfolgen und Facetten.
Es gibt auch eine Reihe von Aggregationspipeline-Optimierungen , die abhängig von Ihrer MongoDB-Serverversion automatisch durchgeführt werden. Beispielsweise können benachbarte Stufen zusammengeführt und / oder neu angeordnet werden, um die Ausführung zu verbessern, ohne die Ausgabeergebnisse zu beeinflussen.
Einschränkungen
Wie in MongoDB 3.4 bietet die explainOption Aggregation Framework Informationen zur Verarbeitung einer Pipeline, unterstützt jedoch nicht den gleichen Detaillierungsgrad wie der executionStatsModus für eine find()Abfrage. Wenn Sie sich auf die Optimierung der anfänglichen Abfrageausführung konzentrieren, wird es wahrscheinlich von Vorteil sein, die entsprechende find().explain()Abfrage mit executionStatsoder allPlansExecutionAusführlichkeit zu überprüfen .
Im MongoDB Issue Tracker gibt es einige relevante Feature-Anfragen, die im Hinblick auf detailliertere Ausführungsstatistiken zur Optimierung / Profilaggregation von Pipelines überwacht / verbessert werden müssen: