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

クエリシェイプ

項目一覧

  • 動作
  • はじめる
  • 詳細

バージョン8.0で変更

クエリシェイプは、類似したクエリをグループ化する仕様のセットです。 仕様には、フィルター、ソート、プロジェクション、集計パイプラインステージ、名前空間などがあります。 同様の仕様を持つクエリは、同じクエリシェイプを持ちます。

注意

MongoDB 8.0以降では、既存のクエリシェイプの名前がプランキャッシュクエリシェイプに変更され、 queryHashフィールドの名前がplanCacheShapeHashに変更されます。 プランキャッシュクエリシェイプを区別するコマンドのコンポーネントについては、 プランキャッシュクエリシェイプの定義を参照してください。 MongoDB 8.0は、このページに示すように、新しいクエリシェイプと既存のプランキャッシュクエリシェイプを使用します。

MongoDB 8.0以前のバージョンでは、既存のプランキャッシュクエリシェイプは次をサポートしています。

MongoDB 8.0以降、新しいクエリシェイプは次の機能をサポートします。

  • クエリ設定。これはsetQuerySettingsで追加できます。 (このページの後半で示すように、クエリ設定はクエリシェイプのインデックスと実行設定を指定します。)

  • $queryStatsクエリシェイプ統計

  • フィールドと操作は プランキャッシュクエリシェイプによってもサポートされています。 たとえば、 filtersortprojection

  • finddistinctaggregateコマンドで使用できるフィールドとオペランドの過半数。 コマンドのフィールドとオペランドを表示するには、各コマンドページの「シンタックス」セクションを参照してください。

  • コマンド、 コマンド、および コマンドの全体的な構造。これらは既存の プランキャッシュクエリシェイプシェイプfind よりも幅広いクエリシェイプをサポートします。aggregationdistinct

  • 操作拒否フィルターは、指定されたクエリシェイプを持つfindaggregation 、および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以降非推奨です。 クエリ設定はインデックスフィルターよりも機能が高く、クラスターのシャットダウン後にインデックスフィルターは永続的ではありません。

クエリ設定を使用すると、クラスター内のクエリシェイプのすべての実行にインデックスを使用できます。 また、操作によって クラスターの過剰なワークロードが発生するのを防ぐために、操作拒否フィルター を使用して、クエリシェイプに関連付けられたすべての操作を拒否することもできます。

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

戻る

クエリプラン