db.collection.explain()
MongoDB とドライバー
このページでは、 mongosh
メソッドについて説明します。MongoDB ドライバーで同等のメソッドを確認するには、ご使用のプログラミング言語の対応するページを参照してください。
説明
db.collection.explain()
次のメソッドのクエリ プランに関する情報を返します。
db.collection.explain()
を使用するには、前述のメソッドのいずれかをdb.collection.explain()
に追加します。db.collection.explain().<method(...)> たとえば、
db.products.explain().remove( { category: "apparel" }, { justOne: true } ) その他の例については、「例」を参照してください。 db.collection.explain().help() も参照してください。
db.collection.explain()
メソッドには次のパラメーターがあります。Parameterタイプ説明verbosity
string任意。 explain 出力の冗長モードを指定します。 モードは
explain()
の動作に影響し、返される情報の量を決定します。 使用可能なモードは次のとおりです。"queryPlanner"
(デフォルト)"executionStats"
"allPlansExecution"
以前のバージョンの
cursor.explain()
との下位互換性のため、MongoDB はtrue
を"allPlansExecution"
として、false
を"queryPlanner"
として解釈します。このモードについて詳しくは、「冗長モード」を参照してください。
動作
注意
explain
を使用すると、既存のすべてのプラン キャッシュ エントリが無視され、MongoDB クエリ プランナーが新しいプラン キャッシュ エントリを作成できなくなります。
冗長モード
db.collection.explain()
の動作と返される情報の量は、 verbosity
モードによって異なります。
デフォルトでは、 db.collection.explain()
はqueryPlanner
の冗長モードで実行されます。
MongoDB はクエリオプティマイザを実行して、評価中の操作に最適なプランを選択します。 db.collection.explain()
は評価されたメソッドのqueryPlanner
情報を返します。
MongoDB では、クエリ オプティマイザーが実行され、勝利プランが選択され、勝利プランが完了まで実行され、勝利プランの実行を説明する統計が返されます。
書込み操作の場合、 db.collection.explain()
は実行されるアップデート操作または削除操作に関する情報を返しますが、変更はデータベースに適用されません。
db.collection.explain()
は評価されたメソッドのqueryPlanner
とexecutionStats
情報を返します。 ただし、 executionStats
では拒否されたプランのクエリ実行情報は提供されません。
また、クエリ オプティマイザーが実行されて最適なプランが選択され、そのプランは完了まで実行されます。"allPlansExecution"
モードでは、MongoDBにより、勝利したプランの実行を説明する統計情報と、プランの選択中に取得された他の候補プランの統計情報が返されます。
書込み操作の場合、 db.collection.explain()
は実行されるアップデート操作または削除操作に関する情報を返しますが、変更はデータベースに適用されません。
db.collection.explain()
は評価されたメソッドのqueryPlanner
とexecutionStats
情報を返します。 executionStats
には、 選出されたプランの完了したクエリ実行情報が含まれます。
クエリオプティマイザが複数のプランを考慮した場合、executionStats
情報には、選択された候補プランと拒否された候補プランの両方について、 プラン選択フェーズ中にキャプチャされ た部分的な実行情報も含まれます。
Explain 操作と Write 操作
書込み(write)操作の場合、db.collection.explain()
は実行される書込み(write)操作に関する情報を返しますが、実際にはデータベースを変更しません。
制限事項
$out
ステージを含む aggregation pipeline
に対して、explain
コマンド/db.collection.explain()
を executionStats
モードまたは allPlansExecution
モードで実行することはできません。代わりに、次のいずれかを実行できます。
explain()
Mechanics
db.collection.explain()
メソッドはexplain
コマンドをラップし、 explain
を実行するための推奨方法です。
db.collection.explain().find()
はdb.collection.find().explain()
と似ていますが、次の重要な違いがあります。
db.collection.explain().find()
構造により、クエリ修飾子の追加の連鎖が可能になります。 Fクエリ修飾子のリストについては、 db.collection.explain().find().help() を参照してください。db.collection.find().explain()
はカーソルを返します。このカーソルにがexplain()
の結果を返すには、.next()
またはそのエイリアス.finish()
を呼び出す必要があります。mongosh
で対話的に実行すると、mongosh
により.finish()
が自動的に呼び出され、結果を返します。ただし、スクリプトの場合、結果を返すためには.next()
または.finish()
を明示的に呼び出す必要があります。カーソル関連のメソッドのリストについては、db.collection.explain().find().help(). を参照してください。
db.collection.explain().aggregate()
は、explain オプションを db.collection.aggregate()
メソッドに渡すことと同じです。
help()
db.collection.explain()
でサポートされている操作のリストを表示するには、次のコマンドを実行します。
db.collection.explain().help()
db.collection.explain().find()
はカーソルを返します。これにより、クエリ修飾子の連鎖が可能になります。db.collection.explain().find()
でサポートされているクエリ修飾子とカーソル関連のメソッドのリストを表示するには、次のコマンドを実行します。
db.collection.explain().find().help()
db.collection.explain().find()
には複数の修飾子を連鎖させることができます。例については、「find()
を修飾子で説明する」を参照してください。
出力
db.collection.explain()
操作は、次の情報を返す場合があります。
explainVersion
、出力形式のバージョン(例:"1"
)command
、説明されているコマンドの詳細が表示されます。queryPlanner
は、クエリオプティマイザによって選択されたプランの詳細を示し、拒否されたプランを一覧で表示します。executionStats
、当選したプランと拒否されたプランの実行の詳細が表示されますserverInfo
、MongoDB インスタンスに関する情報を提供しますおよびserverParameters
内部パラメータの詳細が表示されます。
冗長モード(つまり、queryPlanner
、 executionStats
、 allPlansExecution
)は、結果にexecutionStats
が含まれるかどうか、およびexecutionStats
にプラン選択中にキャプチャされたデータが含まれるかどうかを決定します。
Explain の出力は、 BSON ドキュメントの最大ネスト深度(100 レベルのネスト)によって制限されます。制限を超える出力は切り捨てられます。
出力の詳細については explain の結果を参照してください。
例
queryPlanner
モード
デフォルトでは、 db.collection.explain()
は"queryPlanner"
の冗長モードで実行されます。
次の例では、 db.collection.explain()
を"queryPlanner"
冗長モードで実行し、指定されたcount()
操作のクエリ計画情報を返します。
db.products.explain().count( { quantity: { $gt: 50 } } )
executionStats
モード
次の例では、 db.collection.explain()
を"executionStats"
冗長モードで実行し、指定されたfind()
操作のクエリ計画と実行情報を返します。
db.products.explain("executionStats").find( { quantity: { $gt: 50 }, category: "apparel" } )
allPlansExecution
モード
次の例では、 db.collection.explain()
を"allPlansExecution"
の冗長モードで実行しています。 db.collection.explain()
は、指定された 操作に対して検討されたすべてのプランのqueryPlanner
executionStats
findAndModify()
と を返します。
注意
この explain を実行してもデータは変更されませんが、アップデート操作のクエリ述語が実行されます。候補プランの場合、MongoDB ではプラン選択フェーズ中に取得された実行情報が返されます。
db.products.explain( "allPlansExecution" ).findAndModify( { query: { name: "Tom", state: "active", rating: { $gt: 10 } }, sort: { rating: 1 }, update: { $inc: { score: 1 } } } )
修飾語find()
を使って を説明する
db.collection.explain().find()
構造により、クエリ修飾子の連鎖が可能になります。 たとえば、次の操作では、find()
sort()
}hint()
クエリ修飾子と クエリ修飾子を持つ メソッドに関する情報が提供されます。
db.products.explain("executionStats").find( { quantity: { $gt: 50 }, category: "apparel" } ).sort( { quantity: -1 } ).hint( { category: 1, quantity: -1 } )
使用可能なクエリ修飾子のリストについては、 mongosh
で次のコマンドを実行します。
db.collection.explain().find().help()
explain().find()
リターンカーソルの反復処理
db.collection.explain().find()
は explain の結果へのカーソルを返します。 mongosh
で対話的に実行すると、 mongosh
は.next()
メソッドを使用してカーソルを自動的に反復します。 ただし、スクリプトの場合、結果を返すには.next()
(またはそのエイリアス.finish()
)を明示的に呼び出す必要があります。
var explainResult = db.products.explain().find( { category: "apparel" } ).next();