[解決済み] AggregationフレームワークのためのMongodbの説明
質問
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 で監視/アップボートを行う関連する機能要求がいくつか存在します。
関連
-
MongoDB の一般的なクエリ文のサンプルコード
-
MongoDBの役割管理について説明する
-
MongoTemplateのidによるクエリがNULLの場合について
-
MongoDB総合まとめ
-
[MongoDB] 127.0.0.1:27017 への接続に失敗しました、理由。接続が拒否されました
-
[解決済み] MongoDBに "like "を使ってクエリを実行する方法
-
[解決済み] コマンドラインからMongoDBデータベースを削除する方法を教えてください。
-
[解決済み] MongoDB コレクションのすべてのドキュメントに新しいフィールドを追加する
-
[解決済み] PyMongoで正規表現クエリを実行する
-
[解決済み] mongorestoreエラー。ダンプファイルをどうすればいいかわからない [閉じた状態]
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MongoDBのログ切り出しの3つの方法のまとめ
-
MongoDBユーザー関連操作
-
MongoDBの役割管理について説明する
-
MongoTemplateのidによるクエリがNULLの場合について
-
Mongodbの包括的なまとめ
-
[解決済み] mongodb は複数のフィールドで値をグループ化します。
-
[解決済み] MongoDBのリレーションシップ:埋め込みか参照か?
-
[解決済み] 別のフィールドの値を使って MongoDB のフィールドを更新する
-
[解決済み] MongoDB コレクションのすべてのドキュメントに新しいフィールドを追加する
-
[解決済み] mongoDB/mongoose: NULLでない場合は一意に決まる