Nuevo en la versión 6.0.7.
Definición
Advertencia
La etapa de agregación $queryStats no es compatible y no se garantiza su estabilidad en futuras versiones. No cree funcionalidades que dependan de un formato de salida específico de esta etapa, ya que este podría cambiar en futuras versiones.
Devuelve estadísticas de tiempo de ejecución para los query registrados.
$queryStats Recopila e informa métricas para
aggregate()find() distinct() Consultas, y. $queryStats no recopila información para consultas que utilizan cifrado consultable.
Requisitos
La $queryStats etapa está habilitada en implementaciones alojadas en MongoDB Atlas con un nivel de clúster de al menos10 M.
Para ejecutar la etapa $queryStats, tu pipeline debe cumplir los siguientes requisitos:
La canalización debe ejecutarse en la base de datos
admin.$queryStatsDebe ser la primera etapa del proceso.
Sintaxis
db.adminCommand( { aggregate: 1, pipeline: [ { $queryStats: { transformIdentifiers: { algorithm: <string>, hmacKey: <binData> /* subtype 8 - used for sensitive data */ } } } ], cursor: { } } )
Importante
No se puede ejecutar $queryStats en una colección específica. Para ver ejemplos completos, consulte Ejemplos.
Campos de comandos
$queryStats toma los siguientes campos:
Campo | Necesidad | Tipo | Descripción |
|---|---|---|---|
| Opcional | Documento | Especifica opciones de transformación adicionales para la salida |
transformIdentifiers.algorithm | Obligatorio si se especifica el objeto | String | El tipo de transformación hash aplicada a la información del espacio de nombres y a los nombres de campo en la salida. El único valor |
transformIdentifiers.hmacKey | Obligatorio si se especifica el objeto | binData | La entrada de clave privada en la transformación HMAC. |
Control de acceso
Si su implementación aplica control de acceso, el usuario que ejecuta $queryStats debe tener los siguientes permisos:
Para ejecutar
$queryStatssin latransformIdentifiersopción, el usuario debe tener el privilegio dequeryStatsReadacción.Para ejecutar
$queryStatscon latransformIdentifiersopción, el usuario debe tener las acciones de privilegioqueryStatsReadqueryStatsReadTransformedy.
El rol integrado proporciona clusterMonitor los queryStatsRead queryStatsReadTransformed privilegios y. El siguiente ejemplo otorga el clusterMonitor rol en la admin base de datos:
db.grantRolesToUser( "<user>", [ { role: "clusterMonitor", db: "admin" } ] )
Comportamiento
Las siguientes secciones describen detalles de comportamiento de la etapa $queryStats.
Cómo $queryStats rastrea las estadísticas de consultas
Las estadísticas de la etapa $queryStats se registran en una colección virtual almacenada en memoria. El límite de memoria de la colección virtual es del 1% de la memoria total del sistema.
Cómo los grupos $queryStats devolvieron documentos
$queryStats agrupa queries con propiedades comunes en el mismo documento de salida. El documento resultante se denomina entrada de estadísticas de query.
$queryStats Agrupa consultas similares normalizando los valores de los campos proporcionados por el usuario según sus tipos de datos. Por ejemplo, un filtro especificado como { item: 'card' } se normaliza a { item :
'?string'}. $queryStats también normaliza los valores de algunas opciones de consulta, como hint y comment.
$queryStats conserva valores literales para opciones como readConcern y readPreference.
Para obtener la lista completa de opciones incluidas en una entrada de estadísticas de consulta,consulte Buscar comando Forma de consulta.
Cómo $queryStats transforma datos usando transformIdentifiers
Cuando se especifica una clave HMAC en la opción transformIdentifiers, $queryStats utiliza la clave HMAC para aplicar una función hash HMAC-SHA-256 en los siguientes datos:
Nombres de campos del documento
Nombres de colecciones
Nombres de bases de datos
$queryStats no aplica la transformación HMAC a los siguientes datos:
Palabras clave MQL como nombres de operadores (por ejemplo,
$gte).Nombres de parámetros como el
partitionByparámetro$setWindowFieldsen.Valores de campo.
$queryStatsnormaliza los valores de campo en una consulta a sus tipos de datos (como número o cadena) cuando se registra la consulta.$queryStatsnunca almacena valores de campo que contengan datos del usuario.
Para ver un ejemplo de salida transformada, consulte Ejemplo transformado.
$queryStats Log Entries
MongoDB registra $queryStats operaciones en los registros de implementación. De forma predeterminada, MongoDB solo registra la invocación de $queryStats operaciones, no su salida. Para $queryStats las operaciones que incluyen la transformIdentifiers opción, puede especificar si la salida transformada se incluye en la entrada del registro.
Para aprender a controlar el $queryStats comportamiento del registro de, consulte Alternar la salida del registro de $queryStats.
Salida
$queryStats Devuelve una matriz de entradas de estadísticas de consulta. Algunas propiedades de estas entradas contienen valores literales y otras están normalizadas para agrupar consultas comunes.
Las entradas de estadísticas de consulta contienen los siguientes documentos de nivel superior:
Documento | Descripción |
|---|---|
| La combinación única de atributos que define una entrada en la salida de las estadísticas de la consulta. El atributo
Cada combinación única de atributos crea una entrada independiente en la colección virtual |
| La hora UTC en la que |
| Contiene métricas de tiempo de ejecución agregadas asociadas a cada entrada de estadísticas de consulta. Cada entrada registra las estadísticas de cada consulta que comparte la misma clave. |
Cada documento de la matriz de salida contiene los siguientes campos:
Campo | Tipo | Literal o normalizado | Descripción |
|---|---|---|---|
| Documento | Literal | Contiene la forma del query y atributos de query adicionales que agrupan un conjunto de queries |
| Documento | Literal | Contiene atributos que se utilizan para agrupar consultas similares. Para más información, consulte Forma de consulta. |
| Documento | Literal | Describe la información del cliente asociada con la clave. |
| Documento | Literal | El nombre de la aplicación cliente |
| Documento | Literal | Describe el controlador utilizado para emitir la consulta. |
| String | Literal | Nombre del controlador utilizado para emitir la consulta. Los valores posibles son |
| String | Literal | Número de versión del controlador utilizado para emitir la consulta |
| Documento | Literal | Describe el sistema operativo utilizado por el cliente que emitió la consulta. |
| String | Literal | Tipo de sistema operativo |
| String | Literal | Nombre del sistema operativo |
| String | Literal | Arquitectura del sistema operativo. Los valores posibles son |
| String | Literal | Número de versión del sistema operativo |
| Documento | Literal | La preocupación de la lectura por la clave |
| String | Literal | El tipo de colección en el que se emitió la consulta. Para más información, consulte Tipo de colección. |
| Documento o cadena | Normalizado | |
| String | Normalizado | El tamaño del lote de la clave. El tamaño del lote especifica el número máximo de documentos que se pueden devolver en cada lote del resultado de una consulta. De forma predeterminada, el tamaño del lote inicial es el menor de |
| String | Normalizado | Comentario asociado a la clave |
| String | Normalizado | |
| Booleano | Normalizado | |
| String | Literal | Preferencia de lectura asociada a la clave |
| String | Literal | La versión de la Stable API asociada con la clave. Consulta API Estable. |
| Booleano | Literal | El |
| Booleano | Literal | El |
| String | Literal | Representación hash de los valores en |
| Documento | Literal | Describe las estadísticas de tiempo de ejecución para la clave |
| Número largo | Literal | Tiempo de ejecución de la consulta más reciente para todas las consultas con la clave dada |
| Número largo | Literal | Número de veces que se han ejecutado consultas con la clave dada |
| Documento | Literal | Describe el tiempo total empleado en ejecutar consultas con la clave dada. Si la consulta Todos los subcampos de |
metrics.totalExecMicros.sum | Número largo | Literal | Tiempo total dedicado a ejecutar consultas con la clave dada |
metrics.totalExecMicros.max | Número largo | Literal | Mayor cantidad de tiempo empleado en ejecutar una consulta con la clave dada |
metrics.totalExecMicros.min | Número largo | Literal | Menor cantidad de tiempo empleado en ejecutar una consulta con la clave dada |
metrics.totalExecMicros.sumOfSquares | NumberDecimal | Literal | Suma de los cuadrados de los tiempos totales de ejecución de todas las consultas con la clave dada. Un valor alto de |
metrics.firstResponseExecMicros | Documento | Literal | Describe el tiempo transcurrido desde que una consulta dentro de la clave comienza a procesarse hasta que el servidor devuelve el primer lote de resultados. Todos los subcampos de |
metrics.firstResponseExecMicros.sum | Número largo | Literal | Cantidad combinada de tiempo transcurrido desde el comienzo del procesamiento de la consulta hasta que el servidor devuelve el primer lote de resultados |
metrics.firstResponseExecMicros.max | Número largo | Literal | Mayor cantidad de tiempo transcurrido desde el inicio del procesamiento de la consulta hasta que el servidor devuelve el primer lote de resultados |
metrics.firstResponseExecMicros.min | Número largo | Literal | El menor tiempo transcurrido desde el inicio del procesamiento de la consulta hasta que el servidor devuelve el primer lote de resultados |
metrics.firstResponseExecMicros.sumOfSquares | NumberDecimal | Literal | Suma de los cuadrados de las cantidades de tiempo transcurrido desde el comienzo del procesamiento de la consulta hasta que el servidor devuelve el primer lote de resultados. Un valor alto |
| Documento | Literal | Describe la cantidad de documentos devueltos por consultas dentro de la clave |
metrics.docsReturned.sum | Número largo | Literal | Número total de documentos devueltos por consultas con la clave dada |
metrics.docsReturned.max | Número largo | Literal | Número máximo de documentos devueltos por una consulta con la clave dada |
metrics.docsReturned.min | Número largo | Literal | El menor número de documentos devueltos por una query con la clave proporcionada. |
metrics.docsReturned.sumOfSquares | NumberDecimal | Literal | Suma de los cuadrados del número de documentos devueltos por una consulta dentro de la clave. Un valor |
| fecha | Literal | Hora en que se utilizó por primera vez una consulta con la clave dada desde el último reinicio |
| fecha | Literal | Hora en que se utilizó por última vez una consulta con la clave dada |
Tipo de colección
El campo key.collectionType indica el tipo de colección en la que se emitió la consulta registrada. El valor collectionType puede ser uno de los siguientes:
Campo | Descripción |
|---|---|
| La consulta fue una operación de flujo de cambio. |
| La consulta se emitió en una colección estándar. |
| La query se emitió en una colección que no existe. |
| La consulta se emitió en una colección de series temporales. |
| La consulta se emitió en una vista. |
| La consulta se emitió en una colección virtual. En estas colecciones virtuales se realizan las siguientes operaciones: |
Forma de consulta
El key.queryShape contiene atributos de consulta que se utilizan para agrupar consultas similares. Los campos en key.queryShape varían según el comando que generó la entrada de estadísticas de consulta. $queryStats crea entradas de estadísticas de consulta para aggregate find los comandos y.
Cada propiedad de forma de consulta corresponde a una opción de consulta. Por ejemplo, key.queryShape.sort corresponde a la sort() especificación para la forma de consulta.
Buscar comando Consulta Forma
La siguiente tabla describe las propiedades de forma de consulta para los comandos find.
Campo | Tipo | Literal o normalizado |
|---|---|---|
| Documento | Normalizado |
| Documento | Literal |
| Documento | Normalizado |
| entero | Normalizado |
| entero | Normalizado |
| Booleano | Literal |
| Documento | Normalizado |
| Documento | Normalizado |
| Booleano | Literal |
| Booleano | Literal |
| Booleano | Literal |
| Booleano | Literal |
| Booleano | Literal |
| Documento | Literal |
| Booleano | Literal |
| Documento | Normalizado |
Forma de consulta de comando agregado
La siguiente tabla describe las propiedades de forma de consulta para los comandos aggregate.
Campo | Tipo | Literal o normalizado |
|---|---|---|
| Arreglo | Normalizado |
| Booleano | Literal |
| Booleano | Literal |
| Documento | Literal |
| Cadena o Documento | Normalizado |
| Documento | Normalizado |
Ejemplos
Para ejecutar los ejemplos de esta sección, comience con los siguientes datos:
db.products.insertMany( [ { item: "card", qty: 15 }, { item: "envelope", qty: 20 }, { item: "stamps" , qty: 30 } ] )
Luego, ejecute estos comandos:
db.products.find( { item: "card" } ) db.products.aggregate( [ { $match: { qty: { $gt: 20 } } } ] )
Los siguientes ejemplos muestran la salida de $queryStats utilizando diferentes tipos de transformación de datos:
La salida del ejemplo $queryStats en las siguientes secciones puede variar según la ejecución de otros comandos.
Ejemplo sin transformar
Aporte:
db.getSiblingDB("admin").aggregate( [ { $queryStats: { } } ] )
Salida:
[ { 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 }) } ]
Ejemplo transformado
Aporte:
db.getSiblingDB("admin").aggregate( [ { $queryStats: { transformIdentifiers: { algorithm: "hmac-sha-256" , hmacKey: BinData(8, "87c4082f169d3fef0eef34dc8e23458cbb457c3sf3n2") } } } ] )
Salida:
[ { 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=', metrics: { lastExecutionMicros: Long("4254"), execCount: Long("1"), keysExamined: { sum: Int("5"), max: Long("5"), min: Long("5"), sumOfSquares: Long("25") }, docsExamined: { sum: Long("1"), max: Long("1"), min: Long("1"), sumOfSquares: Long("1") }, hasSortStage: false, usedDisk: false, fromMultiPlanner: false, fromPlanCache: true, totalExecMicros: { sum: Long("4254"), max: Long("4254"), min: Long("4254"), sumOfSquares: Long("18096516") }, firstResponseExecMicros: { sum: Long("4254"), max: Long("4254"), min: Long("4254"), sumOfSquares: Long("18096516") }, docsReturned: { sum: Long("1"), max: Long("1"), min: Long("1"), sumOfSquares: Long("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=', metrics: { lastExecutionMicros: Long("350"), execCount: Long("3"), keysExamined: { sum: Int("5"), max: Long("5"), min: Long("5"), sumOfSquares: Long("25") }, docsExamined: { sum: Long("1"), max: Long("1"), min: Long("1"), sumOfSquares: Long("1") }, hasSortStage: false, usedDisk: false, fromMultiPlanner: false, fromPlanCache: true, totalExecMicros: { sum: Long("3084"), max: Long("2499"), min: Long("235"), sumOfSquares: Long("6422726") }, firstResponseExecMicros: { sum: Long("3084"), max: Long("2499"), min: Long("235"), sumOfSquares: Long("6422726") }, docsReturned: { sum: Long("3"), max: Long("1"), min: Long("1"), sumOfSquares: Long("3") }, firstSeenTimestamp: ISODate("2023-11-29T21:16:17.796Z"), latestSeenTimestamp: ISODate("2023-11-29T21:17:12.385Z") }, asOf: Timestamp({ t: 1701293302, i: 0 }) }, ]
Para utilizar el controlador de MongoDB Node.js para agregar una etapa de $queryStats a una canalización de agregación, utilice el Operador $queryStats en un objeto de canalización.
Ejemplo sin transformar
El siguiente ejemplo crea una etapa de canalización que genera estadísticas de tiempo de ejecución sin transformar sobre las consultas registradas. A continuación, ejecuta la canalización de agregación:
const pipeline = [{ $queryStats: {} }]; const adminDb = client.db("admin"); const cursor = adminDb.aggregate(pipeline); return cursor;
Ejemplo transformado
Para devolver las estadísticas de consulta transformadas, incluya el campo transformIdentifiers en la etapa de canalización:
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;
Recopilación de datos de MongoDB Atlas
MongoDB Atlas utiliza periódicamente $queryStats para recopilar datos anónimos sobre tus queries, lo que ayuda a mejorar los productos de MongoDB. Tus datos también pueden utilizarse para hacer sugerencias de funcionalidades en función del uso. MongoDB retiene los datos que recopila con $queryStats durante cuatro años.
Cuando Atlas ejecuta $queryStats en su implementación, utiliza una clave HMAC única por organización Atlas para transformar sus datos y evitar la recopilación de información confidencial.