バージョン7.0.12の新機能: ( 6.0.7以降でも利用可能)
定義
警告
$queryStats集計ステージはサポートされておらず、将来のリリースで安定することは保証されません。 このステージの特定の出力形式に依存する機能はビルドしないでください。出力は将来のリリースで変更される可能性があるためです。
記録されたクエリの実行時間統計を返します。
$queryStats は、  aggregate() 、 find() 、 distinct()クエリのメトリクスを収集とレポートします。 $queryStatsは、 Queryable Encryption を使用するクエリの情報を収集しません。
要件
$queryStatsステージは、少なくとも M 10のクラスター階層を持つ MongoDB Atlasでホストされている配置で有効になっています。
$queryStatsステージを実行するには、パイプラインが次の要件を満たしている必要があります。
- パイプラインは - adminデータベースで実行する必要があります。
- $queryStatsは、パイプラインの最初のステージである必要があります。
構文
db.adminCommand( {    aggregate: 1,    pipeline: [       {          $queryStats: {             transformIdentifiers: {                algorithm: <string>,                hmacKey: <binData> /* subtype 8 - used for sensitive data */             }          }       }    ],    cursor: { }  } ) 
重要
特定のコレクションに対して$queryStatsを実行することはできません。 完全な例については、「例 」を参照してください。
コマンドフィールド
$queryStats は、次のフィールドがあります。
| フィールド | 必要性 | タイプ | 説明 | 
|---|---|---|---|
| 
 | 任意 | ドキュメント | 
 | 
| transformIdentifiers.algorithm | 
 | 文字列 | 出力内の名前空間情報とフィールド名に適用されるハッシュ変換のタイプ。 現在サポートされている | 
| transformIdentifiers.hmacKey | 
 | binData | HMAC 変換での秘密キー入力。 | 
アクセス制御
配置でアクセス制御が強制されている場合、 $queryStatsを実行しているユーザーには次の権限が必要です。
- transformIdentifiersオプションなしで- $queryStatsを実行するには、ユーザーは- queryStatsRead特権アクションを持っている必要があります。
- transformIdentifiersオプションを使用して- $queryStatsを実行するには、ユーザーは- queryStatsReadと- queryStatsReadTransformedの両方の特権アクションを持っている必要があります。
組み込みのclusterMonitor queryStatsReadqueryStatsReadTransformedロールには、 特権と 特権が付与されます。次の例では、 adminデータベースでclusterMonitorロールを付与しています。
db.grantRolesToUser(    "<user>",    [ { role: "clusterMonitor", db: "admin" } ] ) 
動作
次のセクションでは、 $queryStatsステージの動作の詳細について説明します。
$queryStats によるクエリ統計の追跡方法
$queryStatsステージの統計情報は、メモリ内に保存される仮想コレクションで追跡されます。 仮想コレクションのメモリ制限は、システムの合計メモリの 1% です。
$queryStats が返されたドキュメントをグループ化する方法
$queryStats は、共通のプロパティを持つクエリを同じ出力ドキュメントにグループ化します。 結果として得られるドキュメントは、クエリ統計エントリと呼ばれます。
$queryStats は、ユーザーから提供されたフィールド値をデータ型に正規化することで、同様のクエリをグループ化します。 たとえば、 { item: 'card' }に指定されたフィルターは{ item :
'?string'}に正規化されます。 $queryStatsは、 hintやcommentなどの一部のクエリ オプションの値も正規化します。
$queryStats では、 readConcernやreadPreferenceなどのオプションのリテラル値が保持されます。
クエリ統計エントリに含まれるオプションの完全なリストについては、 find コマンド クエリシェイプ を参照してください。
transformIdentifiers を使用して $queryStats がデータを変換する方法
HMAC キーがtransformIdentifiersオプションに指定されている場合、 $queryStatsは HMAC キーを使用して、次のデータに HMAC-SHA-256 ハッシュ関数を適用します。
- ドキュメント フィールド名 
- コレクション名 
- データベース名 
$queryStats では、次のデータには HMAC 変換は適用されません。
- 演算子名などの MQL キーワード(例: - $gte)。
- パラメータ名( - $setWindowFieldsの- partitionByパラメータなど)
- フィールド値。 - $queryStatsは、クエリが記録されるときに、クエリ内のフィールド値をデータ型( 数値 やstringなど)に正規化します。- $queryStatsはユーザー データを含むフィールド値を保存しません。
変換された出力の例については、「変換された例 」を参照してください。
$queryStats Log Entries
MongoDB は配置ログに$queryStats操作を記録します。デフォルトでは、MongoDB は$queryStats操作の呼び出しのみをログに記録し、操作の出力は記録しません。transformIdentifiersオプションを含む$queryStats操作の場合、変換された出力をログ エントリに含めるかどうかを指定できます。
$queryStatsのログ動作を制御する方法については、「 $queryStats ログ出力の切り替え 」を参照してください。
出力
$queryStats は、クエリ統計エントリの配列を返します。 一部のクエリ統計エントリ プロパティにはリテラル値が含まれており、一部のプロパティは一般的なクエリをグループ化するように正規化されています。
クエリ統計エントリには、次の最上位ドキュメントが含まれます。
| ドキュメント | 説明 | 
|---|---|
| 
 | クエリ統計出力のエントリを定義する属性の一意の組み合わせ。  
 属性の一意の組み合わせごとに、  | 
| 
 | 
 | 
| 
 | 各クエリ統計エントリに関連付けられた集計されたランタイム メトリクスが含まれています。 各クエリ統計エントリは、同じキーを共有する各クエリの統計情報を記録します。 | 
出力配列内の各ドキュメントには、次のフィールドが含まれています。
| フィールド | タイプ | リテラルまたは正規化 | 説明 | 
|---|---|---|---|
| 
 | ドキュメント | literal | クエリのセットをグループ化するクエリシェイプと追加のクエリ属性が含まれます | 
| 
 | ドキュメント | literal | 類似したクエリをグループ化するために使用される属性が含まれています。 詳細については、「 クエリシェイプ 」を参照してください。 | 
| 
 | ドキュメント | literal | キーに関連付けられたクライアント情報を記述します | 
| 
 | ドキュメント | literal | クライアント・アプリケーション名 | 
| 
 | ドキュメント | literal | クエリの発行に使用されるドライバーについて説明します | 
| 
 | 文字列 | literal | クエリの発行に使用されるドライバーの名前。 可能な値は | 
| 
 | 文字列 | literal | クエリの発行に使用されるドライバーのバージョン番号 | 
| 
 | ドキュメント | literal | クエリを発行したクライアントが使用するオペレーティング システムを説明します | 
| 
 | 文字列 | literal | オペレーティング システムの種類 | 
| 
 | 文字列 | literal | オペレーティング システムの名前 | 
| 
 | 文字列 | literal | オペレーティング システムのアーキテクチャ。 可能な値は | 
| 
 | 文字列 | literal | オペレーティング システムのバージョン番号 | 
| 
 | ドキュメント | literal | キーの 読み取り保証 ( read concern ) | 
| 
 | 文字列 | literal | クエリが発行されたコレクションのタイプ。 詳細については、「 コレクション タイプ 」を参照してください。 | 
| 
 | ドキュメントまたは文字列 | 正規化 | クエリのヒントとして使用されたインデックス | 
| 
 | 文字列 | 正規化 | キーのバッチするサイズ。バッチ サイズは、クエリ結果の各バッチするで返されるドキュメントの最大数を指定します。デフォルトでは 、初期バッチするサイズは  | 
| 
 | 文字列 | 正規化 | キーに関連付けられたコメント | 
| 
 | 文字列 | 正規化 | キーに関連付けられたmaxTimeMS値 | 
| 
 | ブール値 | 正規化 | キーに関連付けられたnoCursorTimeoutオプション | 
| 
 | 文字列 | literal | キーに関連付けられた読み込み設定(read preference ) | 
| 
 | 文字列 | literal | キーに関連付けられている Stable API バージョン。 詳しくは、 Stable API を参照してください。 | 
| 
 | ブール値 | literal | キーに関連付けられた | 
| 
 | ブール値 | literal | キーに関連付けられた | 
| 
 | 文字列 | literal | 
 | 
| 
 | ドキュメント | literal | キーの実行時統計を記述します | 
| 
 | NumberLong | literal | 指定されたキーを持つすべてのクエリに対する最新のクエリの実行ランタイム | 
| 
 | NumberLong | literal | 指定されたキーを持つクエリが実行された回数 | 
| 
 | ドキュメント | literal | 指定されたキーでクエリの実行に費やされた合計時間を説明します。 クエリで 
 | 
| metrics.totalExecMicros.sum | NumberLong | literal | 指定されたキーでクエリの実行に費やされた時間の合計 | 
| metrics.totalExecMicros.max | NumberLong | literal | 指定されたキーでクエリの実行に費やされた最も長い時間 | 
| metrics.totalExecMicros.min | NumberLong | literal | 指定されたキーでクエリの実行に費やされた最も短い時間 | 
| metrics.totalExecMicros.sumOfSquares | NumberDecimal | literal | 指定されたキーを持つすべてのクエリの合計実行時間の正方形の合計。  | 
| metrics.firstResponseExecMicros | ドキュメント | literal | キー内のクエリの処理が開始されてから、サーバーが結果の最初のバッチを返すまでに費やされた時間を説明します 
 | 
| metrics.firstResponseExecMicros.sum | NumberLong | literal | クエリ処理の開始からサーバーが結果の最初のバッチを返すまでに費やされた時間の合計 | 
| metrics.firstResponseExecMicros.max | NumberLong | literal | クエリ処理の開始からサーバーが結果の最初のバッチを返すまでに費やされた時間の最長 | 
| metrics.firstResponseExecMicros.min | NumberLong | literal | クエリ処理の開始からサーバーが結果の最初のバッチを返すまでに費やされる最も短い時間 | 
| metrics.firstResponseExecMicros.sumOfSquares | NumberDecimal | literal | クエリ処理の開始からサーバーが結果の最初のバッチを返すまでに費やされた時間の正方形の合計。 
 | 
| 
 | ドキュメント | literal | キー内のクエリによって返されたドキュメントの数を示します | 
| metrics.docsReturned.sum | NumberLong | literal | 指定されたキーを持つクエリによって返されたドキュメントの合計数 | 
| metrics.docsReturned.max | NumberLong | literal | 指定されたキーを持つクエリによって返されるドキュメントの最大数 | 
| metrics.docsReturned.min | NumberLong | literal | 指定されたキーを持つクエリによって返されたドキュメントの最小数 | 
| metrics.docsReturned.sumOfSquares | NumberDecimal | literal | キー内のクエリによって返されたドキュメント数の正方形の合計。 
 | 
| 
 | 日付 | literal | 前回の再起動以降、指定されたキーを持つクエリが最初に使用された時間 | 
| 
 | 日付 | literal | 指定されたキーを持つクエリが最後に使用された時間 | 
collectionType
key.collectionTypeフィールドは、記録されたクエリが発行されたコレクションのタイプを示します。 collectionTypeは次のいずれかの値になります。
| フィールド | 説明 | 
|---|---|
| 
 | クエリは変更ストリーム操作 でした。 | 
| 
 | クエリは標準コレクションに対して発行されました。 | 
| 
 | クエリは、存在しないコレクションに対して発行されました。 | 
| 
 | クエリは時系列コレクションに対して発行されました。 | 
| 
 | クエリはビューに対して発行されました。 | 
| 
 | クエリは仮想コレクションに対して発行されました。 仮想コレクションでは、次の操作が実行されます。 | 
クエリシェイプ
key.queryShapeには、類似したクエリをグループ化するために使用されるクエリ属性が含まれています。 key.queryShapeのフィールドは、クエリ統計エントリを生成したコマンドに基づいて異なります。 $queryStatsは、 aggregate } コマンドとfindコマンドのクエリ統計エントリを作成します。
各クエリシェイプ プロパティは、クエリ オプションに対応します。 たとえば、 key.queryShape.sortは、クエリシェイプのsort()仕様に対応します。
find コマンド クエリシェイプ
以下の表では、 findコマンドのクエリシェイプ プロパティを説明しています。
| フィールド | タイプ | リテラルまたは正規化 | 
|---|---|---|
| 
 | ドキュメント | 正規化 | 
| 
 | ドキュメント | literal | 
| 
 | ドキュメント | 正規化 | 
| 
 | 整数 | 正規化 | 
| 
 | 整数 | 正規化 | 
| 
 | ブール値 | literal | 
| 
 | ドキュメント | 正規化 | 
| 
 | ドキュメント | 正規化 | 
| 
 | ブール値 | literal | 
| 
 | ブール値 | literal | 
| 
 | ブール値 | literal | 
| 
 | ブール値 | literal | 
| 
 | ブール値 | literal | 
| 
 | ドキュメント | literal | 
| 
 | ブール値 | literal | 
| 
 | ドキュメント | 正規化 | 
集計コマンド クエリシェイプ
以下の表では、 aggregateコマンドのクエリシェイプ プロパティを説明しています。
| フィールド | タイプ | リテラルまたは正規化 | 
|---|---|---|
| 
 | 配列 | 正規化 | 
| 
 | ブール値 | literal | 
| 
 | ブール値 | literal | 
| 
 | ドキュメント | literal | 
| 
 | 文字列またはドキュメント | 正規化 | 
| 
 | ドキュメント | 正規化 | 
例
このセクションの例を実行するには、次のデータで を開始します。
db.products.insertMany(   [     { item: "card", qty: 15 },     { item: "envelope", qty: 20 },     { item: "stamps" , qty: 30 }   ] ) 
次に、次のコマンドを実行します。
db.products.find( { item: "card" } ) db.products.aggregate( [     {       $match: { qty: { $gt: 20 } }     } ] ) 
次の例は、さまざまなタイプのデータ変換を使用した$queryStatsの出力を示しています。
次のセクションの例: $queryStats の出力は、他のコマンドの実行によって異なる場合があります。
変換されていない例
入力:
db.getSiblingDB("admin").aggregate( [     {       $queryStats: { }     } ] ) 
出力:
[   {     key: {       queryShape: {         cmdNs: { db: 'test', coll: 'products' },         command: 'find',         filter: { item: { '$eq': '?string' } }       },       client: {         driver: { name: 'nodejs|mongosh', version: '5.1.0' },         os: {           type: 'Darwin',           name: 'darwin',           architecture: 'arm64',           version: '22.6.0'         },         platform: 'Node.js v16.19.1, LE (unified)',         version: '5.1.0|1.8.0',         application: { name: 'mongosh 1.8.0' }       },       collectionType: 'collection'     },     keyHash: 'dsoJ+LHAru0z6MJ1/IygJnnLTrlpVYYmPnlmNZbZrLI=',     queryShapeHash: "uxMLCvpiJ5N/IRqt4c28/0A8F01C8AA16CA805FF5C1A5737535F97E40C2A90CE91A82CCB7A74C7CCB9C48",     metrics: {       lastExecutionMicros: Long("4254"),       execCount: Long("1"),       totalExecMicros: {         sum: Long("4254"),         max: Long("4254"),         min: Long("4254"),         sumOfSquares: Decimal128("18096516")       },       firstResponseExecMicros: {         sum: Long("4254"),         max: Long("4254"),         min: Long("4254"),         sumOfSquares: Decimal128("18096516")       },       docsReturned: {         sum: Long("1"),         max: Long("1"),         min: Long("1"),         sumOfSquares: Decimal128("1")       },       firstSeenTimestamp: ISODate("2023-09-14T12:30:27.989Z"),       latestSeenTimestamp: ISODate("2023-09-14T12:30:27.989Z")     },     asOf: Timestamp({ t: 1694695007, i: 0 })   },   {     key: {       queryShape: {         cmdNs: { db: 'test', coll: 'products' },         command: 'aggregate',         pipeline: [           { '$match': { qty: { '$gt': '?number' } } }         ]       },       apiVersion: '1',       client: {         driver: { name: 'nodejs|mongosh', version: '5.1.0' },         os: {           type: 'Darwin',           name: 'darwin',           architecture: 'arm64',           version: '22.6.0'         },         platform: 'Node.js v16.19.1, LE (unified)',         version: '5.1.0|1.8.0',         application: { name: 'mongosh 1.8.0' }       },       collectionType: 'collection',       cursor: { batchSize: '?number' }     },     keyHash: '2QLBfL0m1lliStdN4XvBjqVBtZQ6ffaB2L1pJ99twT8=',     queryShapeHash: "uxMLCvpiJ5N/IRqt4c28/0A8F01C8AA16CA805FF5C1A5737535F97E40C2A90CE91A82CCB7A74C7CCB9C48",     metrics: {       lastExecutionMicros: Long("350"),       execCount: Long("3"),       totalExecMicros: {         sum: Long("3084"),         max: Long("2499"),         min: Long("235"),         sumOfSquares: Decimal128("6422726")       },       firstResponseExecMicros: {         sum: Long("3084"),         max: Long("2499"),         min: Long("235"),         sumOfSquares: Decimal128("6422726")       },       docsReturned: {         sum: Long("3"),         max: Long("1"),         min: Long("1"),         sumOfSquares: Decimal128("3")       },       firstSeenTimestamp: ISODate("2023-11-29T21:16:17.796Z"),       latestSeenTimestamp: ISODate("2023-11-29T21:17:12.385Z")     },     asOf: Timestamp({ t: 1701292827, i: 0 })   } ] 
変換例
入力:
db.getSiblingDB("admin").aggregate( [     {       $queryStats: {           transformIdentifiers: {             algorithm: "hmac-sha-256" ,             hmacKey: BinData(8, "87c4082f169d3fef0eef34dc8e23458cbb457c3sf3n2")           }         }     }   ] ) 
出力:
[   {     key: {       queryShape: {         cmdNs: {           db: 'Mtrt3iG7dsX5c5uCSIhSVlcu5qD3u3xx2EQnS1dJLxM=',           coll: '3oJE6AyOuf8h5NqWiXETxulFlPm3QUXbMnMjL2EqAU4='         },         command: 'find',         filter: {           'VWVRow7Ure92ajRPfrpWiU8OtDeWcLePFIq0+tooBng=': { '$eq': '?string' }         }       },       client: {         driver: { name: 'nodejs|mongosh', version: '5.1.0' },         os: {           type: 'Darwin',           name: 'darwin',           architecture: 'arm64',           version: '22.6.0'         },         platform: 'Node.js v16.19.1, LE (unified)',         version: '5.1.0|1.8.0',         application: { name: 'mongosh 1.8.0' }       },       collectionType: 'collection'     },     keyHash: 'q4vxam+wbk8tTrl8D0MDFH1LQAbI8fWspfkGKhEUROk=',     queryShapeHash: "uxMLCvpiJ5N/IRqt4c28/0A8F01C8AA16CA805FF5C1A5737535F97E40C2A90CE91A82CCB7A74C7CCB9C48",     metrics: {       lastExecutionMicros: Long("4254"),       execCount: Long("1"),       keysExamined: {         sum: Int("5"),         max: Long("5"),         min: Long("5"),         sumOfSquares: Decimal128("25")       },       docsExamined: {         sum: Long("1"),         max: Long("1"),         min: Long("1"),         sumOfSquares: Decimal128("1")       },       hasSortStage: {true: Long("0"), false: Long("1")},       usedDisk: {true: Long("0"), false: Long("1")},       fromMultiPlanner: {true: Long("0"), false: Long("1")},       fromPlanCache: {true: Long("1"), false: Long("0")},       totalExecMicros: {         sum: Long("4254"),         max: Long("4254"),         min: Long("4254"),         sumOfSquares: Decimal128("18096516")       },       firstResponseExecMicros: {         sum: Long("4254"),         max: Long("4254"),         min: Long("4254"),         sumOfSquares: Decimal128("18096516")       },       docsReturned: {         sum: Long("1"),         max: Long("1"),         min: Long("1"),         sumOfSquares: Decimal128("1")       },       firstSeenTimestamp: ISODate("2023-09-14T12:30:27.989Z"),       latestSeenTimestamp: ISODate("2023-09-14T12:30:27.989Z")     },     asOf: Timestamp({ t: 1694695712, i: 0 })   },   {     key: {       queryShape: {         cmdNs: {           db: 'Mtrt3iG7dsX5c5uCSIhSVlcu5qD3u3xx2EQnS1dJLxM=',           coll: '3oJE6AyOuf8h5NqWiXETxulFlPm3QUXbMnMjL2EqAU4='         },         command: 'aggregate',         pipeline: [           {             '$match': {               'RVqrwNEPotzdKnma/T7s4YcgNvpqO29BMDoni2N4IMI=': { '$gt': '?number' }             }           }         ]       },       apiVersion: '1',       client: {         driver: { name: 'nodejs|mongosh', version: '5.1.0' },         os: {           type: 'Darwin',           name: 'darwin',           architecture: 'arm64',           version: '22.6.0'         },         platform: 'Node.js v16.19.1, LE (unified)',         version: '5.1.0|1.8.0',         application: { name: 'mongosh 1.8.0' }       },       collectionType: 'collection',       cursor: { batchSize: '?number' }     },     keyHash: 'HEhpQTYB+/wVoHLkOkMd+EC2jguQlMJ1N/vTE7+b8Js=',     queryShapeHash: "uxMLCvpiJ5N/IRqt4c28/0A8F01C8AA16CA805FF5C1A5737535F97E40C2A90CE91A82CCB7A74C7CCB9C48",     metrics: {       lastExecutionMicros: Long("350"),       execCount: Long("3"),       keysExamined: {         sum: Int("5"),         max: Long("5"),         min: Long("5"),         sumOfSquares: Decimal128("25")       },       docsExamined: {         sum: Long("1"),         max: Long("1"),         min: Long("1"),         sumOfSquares: Decimal128("1")       },       hasSortStage: {true: Long("0"), false: Long("1")},       usedDisk: {true: Long("0"), false: Long("1")},       fromMultiPlanner: {true: Long("0"), false: Long("1")},       fromPlanCache: {true: Long("1"), false: Long("0")},       totalExecMicros: {         sum: Long("3084"),         max: Long("2499"),         min: Long("235"),         sumOfSquares: Decimal128("6422726")       },       firstResponseExecMicros: {         sum: Long("3084"),         max: Long("2499"),         min: Long("235"),         sumOfSquares: Decimal128("6422726")       },       docsReturned: {         sum: Long("3"),         max: Long("1"),         min: Long("1"),         sumOfSquares: Decimal128("3")       },       firstSeenTimestamp: ISODate("2023-11-29T21:16:17.796Z"),       latestSeenTimestamp: ISODate("2023-11-29T21:17:12.385Z")     },     asOf: Timestamp({ t: 1701293302, i: 0 })   }, ] 
MongoDB Node.jsドライバーを使用して $queryStats ステージを集計パイプラインに追加するには、パイプラインオブジェクトで $queryStats 演算子を使用します。
変換されていない例
次の例では、記録されたクエリに関する非変換ランタイム統計を出力するパイプラインステージを作成します。次に、この例では集計パイプラインを実行します。
const pipeline = [{ $queryStats: {} }]; const adminDb = client.db("admin"); const cursor = adminDb.aggregate(pipeline); return cursor; 
変換例
変換されたクエリ統計を返すには、パイプラインステージに transformIdentifiersフィールドを含めます。
const pipeline = [   {      $queryStats: {       transformIdentifiers: {         algorithm: "hmac-sha-256",         hmacKey: new Binary(Buffer.from("87c4082f169d3fef0eef34dc8e23458cbb457c3aabbccddeeff00112233445566778899", "hex"), 8)       }     }   } ]; const adminDb = client.db("admin"); const cursor = adminDb.aggregate(pipeline); return cursor; 
MongoDB Atlas Data Collection
MongoDB Atlas は定期的に$queryStatsを使用してクエリに関する匿名化データを収集し、MongoDB 製品の改善に役立ちます。 データは、使用状況に基づいて機能の提案を作成する目的でも使用される場合があります。 MongoDB は$queryStatsで収集したデータを 4 年間保持します。
Atlas が配置で$queryStatsを実行する場合、Atlas 組織ごとに一意の HMAC キーを使用してデータを変換し、機密情報の収集を回避します。