定義
バージョン8.0の新機能。
setQuerySettings は、 find 、 distinct 、およびaggregateコマンドで使用されるクエリ設定を定義します。
クエリ設定を使用して、操作拒否フィルターの定義、インデックスヒントの追加、およびクラスターでの特定のクエリシェイプのすべての実行に対する他のフィールドの設定ができます。クラスターのクエリ設定は再起動後も保持されます。
The クエリオプティマイザ uses クエリ settings as an additional input during クエリ planning.クエリ設定 のインデックス ヒントは、プランナーで使用できるインデックスのセットを制限しますが、プランナーがインデックスを使用することを保証するものではありません。プランナーは、特定のクエリシェイプハッシュの最適なプランとしてコレクションスキャンを選択することもできます。
クラスタークエリ設定は、 コマンドフィールドとして渡されるクエリ設定やインデックスヒントよりも優先されます。MongoDB は、一致するクエリ設定にすでにインデックスヒントが含まれている場合、コマンド フィールド内のインデックスヒントを無視します。
インデックスのヒントはクエリシェイプには影響しません。
For more information about hints and query settings, see Query Settings Syntax.
注意
クエリ設定を削除するには、removeQuerySettings を使用します。現在のクエリ設定を確認するには、集計パイプラインの $querySettings ステージを使用します。
クエリ設定とインデックス フィルター
MongoDB 8.0 以降、インデックスフィルターは非推奨です。代わりにクエリ設定を使用してください。
クエリ設定は、インデックスフィルターよりも多くの機能を持ちます。インデックス フィルターは永続的ではなく、すべてのクラスター ノードのインデックスフィルターを簡単に作成することはできません。
互換性
このコマンドは、次の環境でホストされている配置で使用できます。
- MongoDB Atlas: The fully managed service for MongoDB deployments in the cloud
重要
This command is not supported in M0 and Flex clusters. For more information, see Unsupported Commands.
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
このセクションに示されている 2 つの構文仕様のいずれかを使用して、クエリ設定を追加または更新できます。
クエリを渡してクエリ設定を設定する
次の構文で、次の値を指定します。
クエリ設定のデータベースを指定する
$dbフィールド。indexHintsおよびその他のフィールドを持つsettingsドキュメント。
db.adminCommand( { setQuerySettings: { <fields>, // Provide fields for // find, distinct, or aggregate command $db: <string> // Provide a database name }, // Provide a settings document with indexHints and other fields settings: { indexHints: [ { ns: { db: <string>, coll: <string> }, allowedIndexes: <array> }, ... ], queryFramework: <string>, reject: <boolean>, comment: <BSON type>, queryKnobs: <document>, maxTimeMS: <non-negative integer> } } )
クエリシェイプハッシュを渡してクエリ設定を設定する
setQuerySettings には既存のクエリシェイプ ハッシュstringを指定し、indexHints およびその他のフィールドを使用して更新された settings ドキュメントを指定できます。
db.adminCommand( { setQuerySettings: <string>, // Provide an existing query shape hash string // Provide a settings document with indexHints and other fields settings: { indexHints: [ { ns: { db: <string>, coll: <string> }, allowedIndexes: <array> }, ... ], queryFramework: <string>, reject: <boolean>, comment: <BSON type>, queryKnobs: <document>, maxTimeMS: <non-negative integer> } } )
クエリシェイプ ハッシュは、クエリシェイプを一意に識別する string です。 クエリシェイプハッシュの例は"F42757F1AEB68B4C5A6DE6182B29B01947C829C926BCC01226BDA4DDE799766C"です。
現在サポートされているバージョンでは、同じクエリシェイプは、ノードや配置タイプ全体で同じクエリシェイプハッシュを生成することが期待されています。ハッシュがノード、配置タイプ、クラスター全体でどのように動作するかを学ぶには、「クエリシェイプハッシュの安定性」を参照してください。
クエリシェイプ ハッシュstringを取得するには、次のいずれかを実行します。
集計パイプライン
$querySettingsの ステージを使用し、queryShapeHashフィールドを調べます。データベースプロファイラーの出力を調べます。
低速クエリ ログの表示
ハッシュされた string を使用してクエリ設定を行った場合、representativeQuery フィールドは初期状態では $querySettings 集計ステージの出力に含まれていません。
MongoDB 8.3 以降、機能の互換性バージョン が 8.3 以降の場合、MongoDB は、クエリシェイプのハッシュを使用して設定したクエリ設定に対して、representativeQuery フィールドをバックフィルします。MongoDB がクエリシェイプに一致するクエリを実行するとき、バックフィルをスケジュールします。バックフィルにはあなたからのアクションは不要です。
バックフィルは、クエリのパフォーマンスへの影響を抑えるために、ベストエフォート方式で非同期に実行されます。クエリ設定は、一致するクエリが初めて実行されるときにバックフィルされることは保証されません。バックフィルが完了しない場合、MongoDB は一致するクエリが次回実行されると、それを再度試行します。
追加の代表クエリを保持するため、MongoDB 8.3 は、クエリ設定における代表クエリのストレージキャパシティーも増加し、元の 16 MB BSON ドキュメント制限を超えます。
Tip
どちらの構文バリエーションでも、 indexHintsドキュメントの配列を提供できます。 indexHintsドキュメントを 1 つだけ提供する場合は、配列括弧を省略できます。
コマンドフィールド
setQuerySettings コマンドの settings ドキュメントは、次のフィールドがあります。
フィールド | フィールド型 | 必要性 | 説明 |
|---|---|---|---|
| ドキュメントまたは文字列 | 必須 | |
| ドキュメント | 任意 | インデックス ヒントの名前空間。 オプションのインデックス ヒントが指定されている場合にのみ必要です。 |
| string | 条件付き | インデックスのヒントのデータベース名。 |
| string | 条件付き | インデックスヒントのコレクション名。 |
| 配列 | 任意 | インデックス ヒント用のインデックスの配列。 インデックスのヒントは、次のいずれかになります。
詳細については、「インデックスと |
| string | 任意 | クエリフレームワークstringは次のように設定できます。
|
| ブール値 | 任意 |
デフォルトは、 クエリシェイプを有効にするには、クエリシェイプに対して
|
| BSON Type | 任意 | コメントには有効なBSONタイプ であれば何でもかまいません。例: string、 オブジェクトなど。 コメントを使用して、クエリ設定に関する追加情報を提供できます。 例、クエリ設定を追加した理由を示す文字列を追加するには、 コメントを更新するには、 コメントを削除することはできませんが、スペース文字を含む string に設定できます。 コメントは、 バージョン 8.1 で追加。(および 8.0.4)。 |
| ドキュメント | 任意 |
他の
バージョン9.0の新機能。 |
| non-negative integer | 任意 | クエリシェイプの実行時間制限をミリ秒単位で設定します。この設定を使用して、アプリケーションコードを変更することなく、単一の回帰シェイプに上限を設けたり、過度に厳しいクライアントタイムアウトを解除したりできます。 クエリ設定から
バージョン9.0の新機能。 |
クエリ パラメータ
バージョン9.0の新機能。
MongoDB 9.0 以降、インスタンス全体ではなく、1 つの クエリシェイプ に対して、queryKnobs 設定を使用して内部サーバーパラメータを上書きすることができます。ターゲットクエリに対して queryKnobs フィールドを設定し、同じ配置上の他のワークロードの動作を変更せずに、1 つの劣化したシェイプの影響を軽減します。
例として、queryKnobs を { noTableScan: true } に設定することで、インスタンス全体ではなく単一のクエリシェイプに対して notablescan サーバーパラメータをオーバーライドできます。
各ノブは、基礎のサーバーパラメータの型、境界、およびデフォルトを維持します。また、setQuerySettings は setParameter が実行するのと同じ検証を実行します。setQuerySettingsは以下の値を拒否します。
不明なノブ
クエリ設定から設定可能とマークされていないノブ
誤ったBSON types
無効な列挙文字列
範囲外の値
最低機能の互換性バージョン要件がクラスターの機能の互換性バージョンを超えるパラメータ
ノブの有効値は、優先順位が高い順に次のようになります。
形状ごとの値の設定方法
queryKnobsインスタンス全体で設定された値。
setParameterコンパイル時に組み込まれたデフォルト値
クエリノブはハッシュされたクエリ設定の一部であるため、プランキャッシュキーの一部でもあります。ノブの値を変更すると、MongoDBは新しいプランキャッシュキーを生成するため、プランナーは古いキャッシュされたプランを再利用するのではなく、新しいプランを作成します。
プロセスごとに適用され、ノード間で異なる可能性があるsetParameterとは異なり、MongoDBは一致するクエリシェイプに対してクラスター全体で同じqueryKnobs値を適用します。
重要
機能の互換性バージョンを9.0から以前のバージョンにダウングレードすると、移行によって保存 (する)クエリ設定が更新されます。移行では、最小機能の互換性バージョンがターゲットバージョンを超えるすべてのノブが除かれ、デフォルト値のみが含まれる設定エントリが削除されます。9.0に再アップグレードしても、削除されたノブは復元されません。setQuerySettingsを使用して再適用する必要があります。
例
次の例では、コレクションを作成し、さまざまなコマンドのクエリ設定を追加します。クラスターでのクエリシェイプのすべての実行において、クエリ プランナーはヒント指定したインデックスまたはコレクションスキャンのいずれかを使用するように制限されます。
サンプル コレクションとインデックスを作成する
実行:
// Create pizzaOrders collection db.pizzaOrders.insertMany( [ { _id: 0, type: "pepperoni", size: "small", price: 19, totalNumber: 10, orderDate: ISODate( "2023-03-13T08:14:30Z" ) }, { _id: 1, type: "pepperoni", size: "medium", price: 20, totalNumber: 20, orderDate: ISODate( "2023-03-13T09:13:24Z" ) }, { _id: 2, type: "pepperoni", size: "large", price: 21, totalNumber: 30, orderDate: ISODate( "2023-03-17T09:22:12Z" ) }, { _id: 3, type: "cheese", size: "small", price: 12, totalNumber: 15, orderDate: ISODate( "2023-03-13T11:21:39.736Z" ) }, { _id: 4, type: "cheese", size: "medium", price: 13, totalNumber: 50, orderDate: ISODate( "2024-01-12T21:23:13.331Z" ) }, { _id: 5, type: "cheese", size: "large", price: 14, totalNumber: 10, orderDate: ISODate( "2024-01-12T05:08:13Z" ) }, { _id: 6, type: "vegan", size: "small", price: 17, totalNumber: 10, orderDate: ISODate( "2023-01-13T05:08:13Z" ) }, { _id: 7, type: "vegan", size: "medium", price: 18, totalNumber: 10, orderDate: ISODate( "2023-01-13T05:10:13Z" ) } ] ) // Create ascending index on orderDate field db.pizzaOrders.createIndex( { orderDate: 1 } ) // Create ascending index on totalNumber field db.pizzaOrders.createIndex( { totalNumber: 1 } )
インデックスのデフォルト名はorderDate_1とtotalNumber_1です。
find コマンドのクエリ設定を追加する
次の例では、 findコマンドのクエリ設定を追加します。 この例では、 findコマンドのsetQuerySettingsにフィールドが含まれており、 allowedIndexesにorderDate_1インデックスが含まれています。
db.adminCommand( { setQuerySettings: { find: "pizzaOrders", filter: { orderDate: { $gt: ISODate( "2023-01-20T00:00:00Z" ) } }, sort: { totalNumber: 1 }, $db: "test" }, settings: { indexHints: { ns: { db: "test", coll: "pizzaOrders" }, allowedIndexes: [ "orderDate_1" ] }, queryFramework: "classic", comment: "Index hint for orderDate_1 index to improve query performance" } } )
(オプション)クエリ設定を確認します
このexplainコマンドを実行します。
db.pizzaOrders.explain().find( { orderDate: { $gt: ISODate( "2023-01-20T00:00:00Z" ) } } ).sort( { totalNumber: 1 } )
次の切り捨てられた出力は、クエリ設定が設定されていることを示しています。
queryPlanner: { winningPlan: { stage: 'SINGLE_SHARD', shards: [ { explainVersion: '1', ... namespace: 'test.pizzaOrders', indexFilterSet: false, parsedQuery: { orderDate: { '$gt': ISODate('2023-01-20T00:00:00.000Z') } }, querySettings: { indexHints: { ns: { db: 'test', coll: 'pizzaOrders' }, allowedIndexes: [ 'orderDate_1' ] }, queryFramework: 'classic', comment: 'Index hint for orderDate_1 index to improve query performance' }, ... } ... ] } }
(任意)クエリを実行する
次の例では、 クエリを実行します。
db.pizzaOrders.find( { orderDate: { $gt: ISODate( "2023-01-20T00:00:00Z" ) } } ).sort( { totalNumber: 1 } )
クエリオプティマイザは、クエリ設定中にクエリ設定を追加入力として使用し、クエリを実行するために選択されたプランに影響します。
クエリ出力は次のようになります。
[ { _id: 0, type: 'pepperoni', size: 'small', price: 19, totalNumber: 10, orderDate: ISODate('2023-03-13T08:14:30.000Z') }, { _id: 5, type: 'cheese', size: 'large', price: 14, totalNumber: 10, orderDate: ISODate('2024-01-12T05:08:13.000Z') }, { _id: 3, type: 'cheese', size: 'small', price: 12, totalNumber: 15, orderDate: ISODate('2023-03-13T11:21:39.736Z') }, { _id: 1, type: 'pepperoni', size: 'medium', price: 20, totalNumber: 20, orderDate: ISODate('2023-03-13T09:13:24.000Z') }, { _id: 2, type: 'pepperoni', size: 'large', price: 21, totalNumber: 30, orderDate: ISODate('2023-03-17T09:22:12.000Z') }, { _id: 4, type: 'cheese', size: 'medium', price: 13, totalNumber: 50, orderDate: ISODate('2024-01-12T21:23:13.331Z') } ]
(任意)クエリ設定を取得する
次の例では、集計パイプラインの$querySettingsステージを使用してクエリ設定を取得します。
db.aggregate( [ { $querySettings: {} } ] )
切り捨てられた出力( queryShapeHashフィールドを含む)
[ { queryShapeHash: 'AB8ECADEE8F0EB0F447A30744EB4813AE7E0BFEF523B0870CA10FCBC87F5D8F1', settings: { indexHints: [ { ns: { db: 'test', coll: 'pizzaOrders' }, allowedIndexes: [ 'orderDate_1' ] } ], queryFramework: 'classic', comment: 'Index hint for orderDate_1 index to improve query performance' }, representativeQuery: { find: 'pizzaOrders', filter: { orderDate: { '$gt': ISODate('2023-01-20T00:00:00.000Z') } }, sort: { totalNumber: 1 }, '$db': 'test' } } ]
個別のコマンドのクエリ設定を追加する
次の例では、 distinctコマンドのクエリ設定を追加します。
db.adminCommand( { setQuerySettings: { distinct: "pizzaOrders", key: "totalNumber", query: { totalNumber: 10, orderDate :{ '$gt': ISODate('2023-01-20T00:00:00.000Z') } } , $db: "test" }, settings: { indexHints: { ns: { db: "test", coll: "pizzaOrders" }, allowedIndexes: [ "orderDate_1" ] }, queryFramework: "classic", comment: "Index hint for orderDate_1 index to improve query performance" } } )
集計コマンドのクエリ設定を追加しました
次の例では、 aggregateコマンドのクエリ設定を追加します。
db.adminCommand( { setQuerySettings: { aggregate: "pizzaOrders", pipeline: [ { $match: { totalNumber: 10, orderDate :{ '$gt': ISODate('2023-01-20T00:00:00.000Z') } } }, { $group: { _id: "$type", totalMediumPizzaOrdersGroupedByType: { $sum: "$totalNumber" } } } ], $db: "test" }, settings: { indexHints: { ns: { db: "test", coll: "pizzaOrders" }, allowedIndexes: [ "totalNumber_1" ] }, queryFramework: "classic", comment: "Index hint for totalNumber_1 index to improve query performance" } } )