クエリシェイプ
バージョン8.0で変更。
クエリシェイプは、類似したクエリをグループ化する仕様のセットです。 仕様には、フィルター、ソート、プロジェクション、集計パイプラインステージ、名前空間などがあります。 同様の仕様を持つクエリは、同じクエリシェイプを持ちます。
注意
MongoDB 8.0以降では、既存のクエリシェイプの名前がプランキャッシュクエリシェイプに変更され、 queryHash
フィールドの名前がplanCacheShapeHash
に変更されます。 プランキャッシュクエリシェイプを区別するコマンドのコンポーネントについては、 プランキャッシュクエリシェイプの定義を参照してください。 MongoDB 8.0は、このページに示すように、新しいクエリシェイプと既存のプランキャッシュクエリシェイプを使用します。
MongoDB 8.0以前のバージョンでは、既存のプランキャッシュクエリシェイプは次をサポートしています。
プランキャッシュシナリオでのクエリ プラン作成。
非推奨のインデックスフィルター。 ( MongoDB 8.0以降では、新しいクエリシェイプに新しいクエリ設定を使用します。)
MongoDB 8.0以降、新しいクエリシェイプは次の機能をサポートします。
クエリ設定。これは
setQuerySettings
で追加できます。 (このページの後半で示すように、クエリ設定はクエリシェイプのインデックスと実行設定を指定します。)フィールドと操作は プランキャッシュクエリシェイプによってもサポートされています。 たとえば、
filter
、sort
、projection
。find
、distinct
、aggregate
コマンドで使用できるフィールドとオペランドの過半数。 コマンドのフィールドとオペランドを表示するには、各コマンドページの「シンタックス」セクションを参照してください。コマンド、 コマンド、および コマンドの全体的な構造。これらは既存の プランキャッシュクエリシェイプシェイプ
find
よりも幅広いクエリシェイプをサポートします。aggregation
distinct
操作拒否フィルターは、指定されたクエリシェイプを持つ
find
、aggregation
、およびdistinct
コマンドをブロックします。集計パイプライン全体 。
MongoDB 8.0以降では、 $querySettings
パイプラインステージを使用して、各クエリシェイプに指定されたクエリ設定を返すことができます。
例
次のセクションでは、次の例のpizzaOrders
コレクションのクエリシェイプを持つ例を示します。
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" ) } ] )
クエリシェイプのマッチング
次のクエリシェイプの例は、デフォルトのtest
データベース内のpizzaOrders
コレクションに対するfind
コマンドの仕様を示しています。
find: "pizzaOrders", filter: { orderDate: { $gt: ISODate( "2023-01-20T00:00:00Z" ) } }, sort: { totalNumber: 1 }, $db: "test"
この例のフィルターでは、注文日が指定された日付よりも後のドキュメントにドキュメントを制限します。 この例では、注文されたピザの合計数を昇順で並べ替えています。
MongoDB 8.0 queryShapeHash
およびplanCacheShapeHash
の 16 進文字列を表示するには、 explain
コマンドを使用します。
次のexplain
の例には、同じクエリシェイプを持つクエリが含まれています。
db.pizzaOrders.explain().find( { orderDate: { $gt: ISODate( "2024-05-10T05:15:35Z" ) } } ). sort( { totalNumber: 1 } ) db.pizzaOrders.explain().find( { orderDate: { $gt: ISODate( "2024-02-05T07:07:16Z" ) } } ). sort( { totalNumber: 1 } ) db.pizzaOrders.explain().find( { orderDate: { $gt: ISODate( "2023-03-08T08:12:25Z" ) } } ). sort( { totalNumber: 1 } )
クエリシェイプは同じため、 explain
の出力には各例に対して同じqueryShapeHash
が含まれ、それぞれに対して同じplanCacheShapeHash
が含まれます。 (例: )。
queryShapeHash: 'AB8ECADEE8F0EB0F447A30744EB4813AE7E0BFEF523B0870CA10FCBC87F5D8F1' planCacheShapeHash: '48E51110'
異なるクエリシェイプ
クエリの仕様が異なる場合、クエリの形状も異なります。 例、クエリに異なるフィルター、ソート、プロジェクション、名前空間、または集計パイプラインステージ がある場合。
前のセクションの例では、この例ではtotalNumber
フィールド でソートしています。 クエリ並べ替えをtotalNumber
から別のフィールドに変更すると、クエリのクエリシェイプは異なります。
例、ピザprice
で並べ替えるとクエリシェイプが変更されます。
db.pizzaOrders.explain().find( { orderDate: { $gt: ISODate( "2023-01-20T00:00:00Z" ) } } ). sort( { price: 1 } )
クエリシェイプは前のセクションのシェイプとは異なるため、 explain
の出力には 前の例とは異なるqueryShapeHash
と、異なるplanCacheShapeHash
が含まれます。 (例: )。
queryShapeHash: 'AC1ECADBE8F1EB0F417A30741AB4813BE7E0BFEF523B0870CA11FCBC87F1A8B2' planCacheShapeHash: '31A52130'
動作
MongoDB 8.0以降では、コレクションのインデックスフィルターではなく、クエリシェイプのクエリ設定を追加します。 インデックス フィルターはMongoDB 8.0以降非推奨です。 クエリ設定はインデックスフィルターよりも機能が高く、クラスターのシャットダウン後にインデックスフィルターは永続的ではありません。
クエリ設定を使用すると、クラスター内のクエリシェイプのすべての実行にインデックスを使用できます。 また、操作によって クラスターの過剰なワークロードが発生するのを防ぐために、操作拒否フィルター を使用して、クエリシェイプに関連付けられたすべての操作を拒否することもできます。
クエリオプティマイザは、クエリプランニング中にクエリ設定を追加入力として使用します。 クエリ設定は、一致するクエリシェイプを持つクエリを実行するために選択されたプランに影響します。
はじめる
クエリシェイプのクエリ設定を追加するには、
setQuerySettings
を使用します。クエリ設定を削除するには、
removeQuerySettings
を使用します。クエリ設定を取得するには、集計パイプラインの
$querySettings
ステージを使用します。クエリシェイプをブロックするには、操作拒否フィルター を使用します。