MongoDB の Aggregation フレームワークの説明関数はありますか? ドキュメントには記載されていません。
そうでない場合、集計フレームワーク内でクエリがどのように実行されるかを確認する他の方法はありますか?
私はあなたがただ見つけることを知っています
db.collection.find().explain()
しかし、集約フレームワークではエラーが発生します
db.collection.aggregate(
{ $project : { "Tags._id" : 1 }},
{ $unwind : "$Tags" },
{ $match: {$or: [{"Tags._id":"tag1"},{"Tags._id":"tag2"}]}},
{
$group:
{
_id : { id: "$_id"},
"count": { $sum:1 }
}
},
{ $sort: {"count":-1}}
).explain()
ベストアンサー1
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
}
)
集約フレームワークに関する重要な考慮事項は、インデックスはパイプラインの初期データ(パイプラインの開始時に、、を使用するなど)と後続の$match
ステージ$sort
およびステージを取得するためにのみ使用できるということです。データが処理のために集約パイプラインに取得されると(、、、などのステージを通過するなど)、それ以降の操作はメモリ内で行われます(オプションが設定されている場合は一時ファイルを使用する可能性があります)。$geonear
$lookup
$graphLookup
$project
$unwind
$group
allowDiskUse
パイプラインの最適化
一般に、集約パイプラインは次の方法で最適化できます。
$match
関連するドキュメントへの処理を制限するステージでパイプラインを開始します。- 初期段階
$match
が$sort
サポートされることを確認する効率的なインデックス。 $match
、、$limit
およびを使用してデータを早期にフィルタリングします$skip
。- 不要なステージとドキュメント操作を最小限に抑えます (複雑な集約操作が必要な場合は、スキーマを再検討する必要があるかもしれません)。
- MongoDBサーバーをアップグレードした場合は、新しい集計演算子を活用しましょう。たとえば、MongoDB 3.4では多くの新しい集計ステージと表現配列、文字列、ファセットの操作のサポートが含まれます。
また、集約パイプラインの最適化これらは、MongoDB サーバーのバージョンに応じて自動的に実行されます。たとえば、出力結果に影響を与えずに実行を改善するために、隣接するステージが結合されたり、順序が変更されたりすることがあります。
制限事項
MongoDB 3.4では、Aggregation Frameworkexplain
オプションはパイプラインの処理方法に関する情報を提供しますが、クエリexecutionStats
のモードと同じレベルの詳細をサポートしていません。最初のクエリ実行の最適化に重点を置いている場合は、同等のクエリを次のようfind()
に確認すると役立つでしょう。find().explain()
executionStats
またはallPlansExecution
冗長。
MongoDB の問題追跡システムには、集約パイプラインの最適化/プロファイル作成に役立つ、より詳細な実行統計に関する、注目/賛成するべき機能リクエストがいくつかあります。