Docs Menu
Docs Home
/
MongoDBマニュアル
/ / /

setQuerySettings

項目一覧

  • 定義
  • 構文
  • コマンドフィールド
  • 詳細
setQuerySettings

バージョン8.0の新機能

クエリ設定を使用して、インデックスのヒントを追加したり、 操作拒否フィルターを定義したり、他のフィールドを設定したりできます。 設定はクラスター全体のクエリシェイプに適用されます。 クラスターはシャットダウン後も設定を保持します。

たとえば、クエリ設定では、クラスター内のクエリシェイプのすべての実行にインデックスを使用できます。

クエリオプティマイザは、クエリ設定中にクエリ設定を追加入力として使用し、クエリを実行するために選択されたプランに影響します。

setQuerySettings は、 finddistinct 、およびaggregateコマンドで使用されるクエリ設定を定義します。

MongoDB 8.0以降では、インデックス フィルターの代わりに クエリ設定 を使用します。 インデックス フィルターは MongoDB 8.0以降非推奨です。

クエリ設定は、インデックス フィルターよりも多くの機能を持ちます。 また、インデックス フィルターは永続的ではなく、すべてのクラスター ノードに対してインデックス フィルターを簡単に作成することはできません。

注意

クエリ設定を削除するには、 removeQuerySettingsを使用します。 クエリ設定を取得するには、集計パイプラインの$querySettingsステージを使用します。

このセクションに示されている 2 つの構文仕様のいずれかを使用して、クエリ設定を追加または更新できます。

次の構文で、次の値を指定します。

  • finddistinct 、またはaggregateコマンドと同じフィールド。 setQuerySettingsに含めることができるフィールドのコマンドについては、 ページの構文セクションを参照してください。

  • クエリ設定のデータベースを指定する$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>
}
} )

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

クエリシェイプ ハッシュは、クエリシェイプを一意に識別する string です。 クエリシェイプハッシュの例は"F42757F1AEB68B4C5A6DE6182B29B01947C829C926BCC01226BDA4DDE799766C"です。

クエリシェイプ ハッシュstringを取得するには、次のいずれかを実行します。

ハッシュstringを使用してクエリ設定を設定すると、$querySettings 集計ステージの出力に representativeQuery フィールドは表示されません。

Tip

どちらの構文バリエーションでも、 indexHintsドキュメントの配列を提供できます。 indexHintsドキュメントを 1 つだけ提供する場合は、配列括弧を省略できます。

このコマンドは、次のフィールドを取ります。

フィールド
フィールドタイプ(ドキュメント、string、...)
必要性
説明
setQuerySettings
ドキュメントまたは string は、
必須

次のいずれかを提供できます。

  • finddistinct 、またはaggregateコマンドと同じフィールド、および元のコマンドに関連付けられているデータベースを持つ$dbフィールドと同じフィールド。

  • クエリシェイプを一意に識別する既存のクエリシェイプ ハッシュstring 。 クエリシェイプハッシュの例は"F42757F1AEB68B4C5A6DE6182B29B01947C829C926BCC01226BDA4DDE799766C"`です。

indexHints.ns
ドキュメント
任意

インデックス ヒントの名前空間。 オプションのインデックス ヒントが指定されている場合にのみ必要です。

db
string
必須
インデックス ヒントのデータベースの名前。
coll
string
必須
インデックス ヒントのコレクションの名前。
indexHints.allowedIndexes
配列
任意

インデックス ヒント用のインデックスの配列。 インデックスのヒントは、次のいずれかになります。

  • インデックス名

  • インデックスキーのパターン

  • $natural hint

詳細については、「インデックスhint() 」を参照してください。

queryFramework
string
任意

クエリフレームワークstringは次のように設定できます。

reject
ブール値
任意

true場合:

  • 一致するクエリシェイプを持つ新しいクエリは拒否され、クエリ応答にクエリが拒否されたことが示されます。

  • 現在進行中のクエリは拒否されません。

デフォルトは、false に設定されています。

クエリシェイプを有効にするには、クエリシェイプに対してsetQuerySettingsを再度実行し、 rejectfalseに設定します。 rejecttrueに設定し、その後setQuerySettingsを使用してfalseに戻すと、次のようになります。

  • settingsドキュメントが空でない場合、 setQuerySettingsはクエリシェイプを有効にします。

  • If your settings document only contains reject: false, then setQuerySettings returns an error. 代わりに、 removeQuerySettingsコマンドを使用して設定を削除し、 setQuerySettingsを使用してクエリ設定を追加します。

次の例では、 コレクションを作成し、さまざまなコマンドのクエリ設定を追加します。 の例では、クラスターで実行されるクエリシェイプのすべての実行に対して 1 つのインデックスを使用します。

1

実行:

// 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_1totalNumber_1です。

2

次の例では、 findコマンドのクエリ設定を追加します。 この例では、 findコマンドのsetQuerySettingsにフィールドが含まれており、 allowedIndexesorderDate_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"
}
} )
3

この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'
},
...
}
...
]
}
}
4

次の例では、 クエリを実行します。

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')
}
]
5

次の例では、集計パイプラインの$querySettingsステージを使用してクエリ設定を取得します。

db.aggregate( [
{ $querySettings: {} }
] )

切り捨てられた出力( queryShapeHashフィールドを含む)

[
{
queryShapeHash: 'AB8ECADEE8F0EB0F447A30744EB4813AE7E0BFEF523B0870CA10FCBC87F5D8F1',
settings: {
indexHints: [
{
ns: { db: 'test', coll: 'pizzaOrders' },
allowedIndexes: [ 'orderDate_1' ]
}
],
queryFramework: 'classic'
},
representativeQuery: {
find: 'pizzaOrders',
filter: { orderDate: { '$gt': ISODate('2023-01-20T00:00:00.000Z') } },
sort: { totalNumber: 1 },
'$db': 'test'
}
}
]
6

次の例では、 distinctコマンドのクエリ設定を追加します。

db.adminCommand( {
setQuerySettings: {
distinct: "pizzaOrders",
key: "totalNumber",
query: { type: "pepperoni"} ,
$db: "test"
},
settings: {
indexHints: {
ns: { db: "test", coll: "pizzaOrders" },
allowedIndexes: [ "orderDate_1" ]
},
queryFramework: "classic"
}
} )
7

次の例では、 aggregateコマンドのクエリ設定を追加します。

db.adminCommand( {
setQuerySettings: {
aggregate: "pizzaOrders",
pipeline: [
{ $match: { size: "medium" } },
{ $group: {
_id: "$type",
totalMediumPizzaOrdersGroupedByType: { $sum: "$totalNumber" }
} }
],
$db: "test"
},
settings: {
indexHints: {
ns: { db: "test", coll: "pizzaOrders" },
allowedIndexes: [ "totalNumber_1" ]
},
queryFramework: "classic"
}
} )

戻る

setDefaultRWConcern