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 explain
Option 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
, $geonear
am Anfang einer Rohrleitung) sowie anschließende $lookup
und $graphLookup
Stufen. 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 allowDiskUse
Option gesetzt ist).
Pipelines optimieren
Im Allgemeinen können Sie Aggregations-Pipelines optimieren, indem Sie:
- Starten einer Pipeline mit einer
$match
Phase, um die Verarbeitung auf relevante Dokumente zu beschränken.
- Sicherstellen, dass die Anfangs-
$match
/ $sort
Phasen durch einen effizienten Index unterstützt werden .
- Filtern von Daten früh mit
$match
, $limit
und $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 explain
Option Aggregation Framework Informationen zur Verarbeitung einer Pipeline, unterstützt jedoch nicht den gleichen Detaillierungsgrad wie der executionStats
Modus 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 executionStats
oder allPlansExecution
Ausfü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: