1. ホーム
  2. mongodb

[解決済み] AggregationフレームワークのためのMongodbの説明

2022-07-06 18:25:35

質問

MongoDBのAggregationフレームワークについて、説明する機能はあるのでしょうか?ドキュメントには見当たりません。

ない場合、集約フレームワーク内でクエリがどのように実行されるかを確認する他の方法はありますか?

私は、findであなたがちょうど行うことを知っています。

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()

どのように解決するのですか?

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
  }
)

Aggregation Frameworkの重要な考慮点は、インデックスがパイプラインの初期データを取得するためにのみ使用できることです(例えば、"Aggregation Framework "で使用されている $match , $sort , $geonear はパイプラインの先頭)だけでなく、後続の $lookup$graphLookup ステージを使用します。データが処理のためにアグリゲーション・パイプラインに取り込まれると (例えば、次のようなステージを通過して) $project , $unwind そして $group の場合、一時ファイルを使用する可能性があります) 更なる操作はメモリ内になります。 allowDiskUse オプションが設定されている場合は一時ファイルを使用することもあります)。

パイプラインの最適化

一般に、アグリゲーションパイプラインは以下の方法で最適化できます。

  • パイプラインを $match ステージを使用して、関連するドキュメントに処理を制限します。
  • 確実に最初の $match / $sort のステージがサポートされています。 効率的なインデックス .
  • を使用して早期にデータをフィルタリングする $match , $limit そして $skip .
  • 不必要なステージとドキュメント操作を最小限に抑えます (おそらく、複雑な集約の体操が必要な場合はスキーマを再考します)。
  • MongoDB サーバーをアップグレードした場合、より新しい集約演算子を利用する。たとえば、MongoDB 3.4 では多くの 新しい集約ステージと式 が追加され、 配列や文字列、ファセットもサポートされるようになりました。

また、多くの アグリゲーション・パイプラインの最適化 があり、MongoDB のサーバーのバージョンに応じて自動的に行われます。たとえば、隣接するステージを合体させたり、並べ替えたりして、出力結果に影響を与えずに実行速度を向上させることができます。

制限事項

MongoDB 3.4 では、アグリゲーションフレームワークは explain オプションはパイプラインがどのように処理されるかという情報を提供します。 executionStats モードでは find() クエリで使用されます。最初のクエリ実行を最適化することに重点を置いているのであれば、同等の find().explain() クエリを executionStats または allPlansExecution 冗長性 .

集約パイプラインの最適化/プロファイリングに役立つ、より詳細な実行統計に関して、MongoDB issue tracker で監視/アップボートを行う関連する機能要求がいくつか存在します。