MongoDBバージョン3.0以降では、単に順序を
collection.aggregate(...).explain()
に
collection.explain().aggregate(...)
目的の結果が得られます(ドキュメントはこちら)。
2.6より古いバージョンの場合、集約パイプライン操作のオプションを使用する必要がありexplain
ます
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
}
)
集約Frameworkでの重要な考慮事項は、インデックスのみをパイプラインの初期データをフェッチするために使用することができるということである(例えばの使用を $match
、$sort
、$geonear
パイプラインの先頭に)だけでなく、それに続く $lookup
と$graphLookup
のステージ。データが処理のために集約パイプラインにフェッチされている(例えばのような段階を通過したら$project
、$unwind
と$group
)さらに操作は、インメモリ(あればおそらく一時ファイルを使用することになりますallowDiskUse
オプションが設定されています)。
パイプラインの最適化
一般に、次の方法で集約パイプラインを最適化できます。
- パイプラインを開始して、
$match
処理を関連ドキュメントに制限するステージを開始します。
- 初期
$match
/ $sort
ステージが効率的なインデックスによってサポートされていることを確認します。
- 、、およびを使用して
$match
、データを早期にフィルタリングします。$limit
$skip
- 不要なステージとドキュメント操作を最小限に抑えます(複雑な集約体操が必要な場合は、おそらくスキーマを再検討してください)。
- MongoDBサーバーをアップグレードした場合は、新しい集計演算子を利用します。たとえば、MongoDB 3.4では、配列、文字列、ファセットの操作のサポートを含む、多くの新しい集計ステージと式が追加されました。
MongoDBサーバーのバージョンに応じて自動的に行われる集約パイプラインの最適化もいくつかあります。例えば、出力結果に影響を与えることなく実行を改善するために、隣接するステージを合体および/または並べ替えることができます。
制限事項
MongoDB 3.4と同様に、Aggregation Framework explain
オプションはパイプラインの処理方法に関する情報を提供しexecutionStats
ますが、find()
クエリのモードと同じ詳細レベルをサポートしていません。最初のクエリ実行の最適化に集中している場合は、同等または詳細なfind().explain()
クエリを確認することが有益であると思われます。executionStats
allPlansExecution
集計パイプラインの最適化/プロファイルを支援するためのより詳細な実行統計に関して、MongoDB課題追跡で監視/賛成する関連機能のリクエストがいくつかあります。