定义
警告
$queryStats聚合阶段不受支持,也不能保证在未来版本中保持稳定。 不要构建依赖于此阶段的特定输出格式的功能,因为输出可能会在将来的版本中发生变化。
返回已记录查询的运行时统计信息。
$queryStats 收集并报告 aggregate()、find()、distinct()、count()、update()、insert()、deleteOne() 和 deleteMany() 查询的指标。 $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 采用以下字段:
字段 | 必要性 | 类型 | 说明 |
|---|---|---|---|
| Optional | 文档 | 为 |
| 如果指定 | 字符串 | 应用于输出中的命名空间信息和字段名称的哈希转换类型。 当前唯一支持的 |
| 如果指定 | BinData | HMAC 转换中输入的私钥。 |
访问控制
如果您的部署强制执行访问控制,则运行$queryStats的用户必须具有以下权限:
要运行不带
transformIdentifiers选项的$queryStats,用户必须具有queryStatsRead权限操作。要使用
transformIdentifiers选项运行$queryStats,用户必须同时具有queryStatsRead和queryStatsReadTransformed权限操作。
内置clusterMonitor角色提供queryStatsRead和queryStatsReadTransformed权限。以下示例授予对admin数据库的clusterMonitor角色:
db.grantRolesToUser( "<user>", [ { role: "clusterMonitor", db: "admin" } ] )
行为
以下部分描述了$queryStats阶段的行为细节。
$queryStats 如何追踪查询统计信息
$queryStats阶段的统计信息在内存中存储的虚拟集合中进行跟踪。 虚拟collection的内存限制为系统总内存的 1%。
$queryStats 如何对操作进行采样
9.0版本新增。
从MongoDB 9.0 开始,$queryStats默认收集 1%写入操作示例的统计数据。要更改采样率,请为读取操作设立internalQueryStatsSampleRate 参数,或为写入操作设置 internalQueryStatsWriteCmdSampleRate 参数。这两个参数都接受 0.0 和 1.0 之间的值。
由于 $queryStats 仅报告MongoDB采样的操作,因此其输出表示针对您的部署运行的操作的子集。计数和执行时间仅反映采样的操作。
$queryStats 如何对返回的文档进行分组
$queryStats 将具有共同属性的查询分组到同一输出文档中。 生成的文档称为查询统计条目。
$queryStats 通过将用户提供的字段值规范化为其数据类型,将类似的查询分组在一起。 例如,指定为{ item: 'card' }的筛选器将规范化为{ item : '?string'} 。 $queryStats还会规范化某些查询选项(如hint和comment的值。
$queryStats 保留readConcern和readPreference等选项的字面值。
有关查询统计条目中包含的完整选项列表,请参阅find 命令查询结构。
$queryStats 如何使用transformIdentifiers 转换数据
当为transformIdentifiers选项指定了 HMAC 密钥时, $queryStats使用该 HMAC 密钥对以下数据应用 HMAC-SHA-256 哈希函数:
文档字段名称
集合名称
数据库名称
$queryStats 不会对以下数据应用 HMAC 转换:
MQL 关键字,例如操作符名称(例如
$gte)。参数名称,例如
$setWindowFields中的partitionBy参数。字段值。
$queryStats在记录查询时将查询中的字段值规范为其数据类型(例如数字或字符串)。$queryStats从不存储包含用户数据的字段值。
有关转换后的输出的示例,请参阅转换后的示例。
$queryStats Log Entries
MongoDB在部署日志中记录$queryStats操作。 默认, MongoDB仅记录$queryStats操作的调用,而不记录操作的输出。 对于包含transformIdentifiers选项的$queryStats操作,您可以指定日志条目中是否包含转换后的输出。
要了解如何控制$queryStats日志行为,请参阅切换 $queryStats 日志输出。
Change Streams
发生以下事件之一时,变更流的查询统计信息会更新:
创建游标
getMore操作完成游标关闭
为变更流报告的查询统计信息具有以下行为:
totalExecMicros等执行指标包含最近操作(游标创建、getMore或游标关闭)的信息。内部
getMore操作会递增execCount指标。firstResponseExecMicros和totalExecMicros始终相同,因为会为每个getMore操作收集和更新统计信息。当游标关闭时,
lastExecutionMicros为0 。
分片集群行为
8.3版本新增。
在分片的集群中,启用 $queryStats 后, MongoDB会分别记录每个 mongod 和 mongos 的查询统计信息。分片服务器还记录源自 mongos 的查询的统计信息。这些为用户通过 mongos 路由的查询提供了更完整的分片级指标。
输出
$queryStats 返回查询统计信息条目的数组。 某些查询统计信息条目属性包含字面值,某些属性已标准化以对常见查询进行分组。
注意
MongoDB 9.0 更新 $queryStats 输出结构以改进指标组织。
查询统计信息条目包含以下顶级文档:
文档 | 说明 |
|---|---|
| 用于定义查询统计信息输出中的条目的唯一属性组合。
每个唯一的属性组合都会在 |
|
|
| 包含与每个查询统计信息条目关联的聚合运行时指标。 每个查询统计信息条目都记录共享相同密钥的每个查询的统计信息。 |
输出数组中的每个文档都包含以下字段:
字段 | 类型 | 字面值或规范化值 | 说明 |
|---|---|---|---|
| 文档 | $literal | 包含查询结构和将一组查询分组在一起的其他查询属性 |
| 文档 | $literal | 包含用于将相似查询群组在一起的属性。 有关详细信息,请参阅查询结构。 |
| 文档 | $literal | 描述与密钥关联的客户端信息 |
| 文档 | $literal | 客户端应用程序名称 |
| 文档 | $literal | 描述用于发出查询的驱动程序 |
| 字符串 | $literal | 用于发出查询的驱动程序的名称。 可能的值包括 |
| 字符串 | $literal | 用于发出查询的驱动程序的版本号 |
| 文档 | $literal | 描述发出查询的客户端使用的操作系统 |
| 字符串 | $literal | 操作系统类型 |
| 字符串 | $literal | 操作系统名称 |
| 字符串 | $literal | 操作系统的架构。 可能的值包括 |
| 字符串 | $literal | 操作系统的版本号 |
| 文档 | $literal | |
| 字符串 | $literal | 发出查询的集合类型。 有关详细信息,请参阅集合类型。 |
| 文档或字符串 | 标准化 | 用作查询提示的索引 |
| 字符串 | 标准化 | 键的批处理大小。批处理大小指定批处理查询结果中可以返回的最大文档数。默认下,初始批处理大小为 |
| 字符串 | 标准化 | 与键关联的注释 |
| 字符串 | 标准化 | 与键关联的maxTimeMS值 |
| 布尔 | 标准化 | 与键关联的noCursorTimeout选项 |
| 字符串 | $literal | |
| 字符串 | $literal | 与密钥关联的 Stable API版本。请参阅用于服务器升级的MongoDB稳定版API 。 |
| 布尔 | $literal | 与键关联的 |
| 布尔 | $literal | 与键关联的 |
| 字符串 | $literal |
|
| 字符串 | $literal | |
| 文档 | $literal | 描述密钥的运行时统计信息 |
| 文档 | $literal | 9.0版本新增。 与游标和批处理协议相关的指标 |
| 文档 | $literal | 在版本9.0中进行了更改。 描述从键内的查询开始处理到服务器返回第批处理结果所花费的时间
|
| 文档 | $literal | 9.0版本新增。 与查询执行相关的指标 |
| 文档 | $literal | 在版本9.0中进行了更改。 描述键内查询返回的文档数量 |
| NumberLong | $literal | 使用给定键的查询返回的文档总数 |
| NumberLong | $literal | 使用给定键的查询返回的最大文档数 |
| NumberLong | $literal | 使用给定键的查询返回的最少文档数 |
| NumberDecimal | $literal | 查询在键内返回的文档数量的平方和。
|
| 文档 | $literal | 描述查询检查的键的数量 |
| 整型 | $literal | 检查的键总数 |
| NumberLong | $literal | 检查的最大键数 |
| NumberLong | $literal | 检查的键数量最少 |
| NumberDecimal | $literal | 检查的键数量的平方和。
|
| 文档 | $literal | 在版本9.0中进行了更改。 描述查询检查的文档数量 |
| 整型 | $literal | 查询中检查的文档总数 |
| NumberLong | $literal | 检查的最大文档数 |
| NumberLong | $literal | 最少检查文件数量 |
| NumberDecimal | $literal | 检查的文档数量的平方和。
|
| 文档 | $literal | 在版本9.0中进行了更改。 描述查询读取的字节数 |
| 整型 | $literal | 查询中读取的总字节数 |
| NumberLong | $literal | 读取的最大字节数 |
| NumberLong | $literal | 读取的最小字节数 |
| NumberDecimal | $literal | 读取字节数的平方和 |
| 文档 | $literal | 在版本9.0中进行了更改。 描述查询的读取时间(以微秒为单位) |
| 整型 | $literal | 查询的总读取时间(以微秒为单位) |
| NumberLong | $literal | 查询的最长读取时间(以微秒为单位) |
| NumberLong | $literal | 查询的最小读取时间(以微秒为单位) |
| NumberDecimal | $literal | 查询读取时间的平方和(以微秒为单位) |
| NumberLong | $literal | 在版本9.0中进行了更改。 查询操作超过预期执行票证获取时间的次数。 |
| NumberLong | $literal | 在版本9.0中进行了更改。 查询操作超过预期执行票证获取时间的总时间(以毫秒为单位)。 |
| NumberLong | $literal | 在版本9.0中进行了更改。 查询操作超过预期执行票证获取时间的最长持续时间(以毫秒为单位)。 |
| NumberLong | $literal | 具有给定键的所有查询的最新查询的执行运行时 |
| NumberLong | $literal | 已执行具有给定键的查询的次数 |
| 文档 | $literal | 在版本9.0中进行了更改。 与查询计划相关的指标 |
| 文档 | $literal | 在版本9.0中进行了更改。 包含两个字段的对象:
|
| 文档 | $literal | 在版本9.0中进行了更改。 包含两个字段的对象:
|
| 文档 | $literal | 在版本9.0中进行了更改。 包含两个字段的对象:
|
| 文档 | $literal | 在版本9.0中进行了更改。 包含两个字段的对象:
|
| 文档 | $literal | |
| 文档 | $literal | 9.0版本新增。 获胜方案的总体形状计数。每个获胜计划最多匹配一个模式。 |
| 文档 | $literal | 9.0版本新增。 获胜计划中出现的计划阶段类型的计数。一个获胜计划可以匹配多个节点计数器。 |
| 文档 | $literal | 9.0版本新增。 获胜计划使用的数据访问路径和索引边界的计数。一个获胜计划可以匹配多个访问权限路径计数器。 |
| 文档 | $literal | 在版本9.0中进行了更改。 与写入相关的指标 |
| NumberLong | $literal | 9.0版本新增。 更新选择的文档数量 |
| NumberLong | $literal | 9.0版本新增。 更新操作插入的文档数 |
| NumberLong | $literal | 9.0版本新增。 更新操作修改的文档数 |
| NumberLong | $literal | 9.0版本新增。 更新操作删除的文档数 |
| NumberLong | $literal | 9.0版本新增。 更新操作插入的文档数,不包括更新或插入 |
| NumberLong | $literal | 9.0版本新增。 原始更新请求中的更新次数 |
| 文档 | $literal | 描述使用给定键运行查询所花费的总时间。 如果查询结果为
|
| NumberLong | $literal | 使用给定键运行查询所花费的总时间 |
| NumberLong | $literal | 使用给定键运行查询所花费的最长时间 |
| NumberLong | $literal | 使用给定键运行查询所花费的最短时间 |
| NumberDecimal | $literal | 具有给定键的所有查询的总执行时间的平方和。 |
| NumberLong | $literal | 从查询处理开始到服务器返回第一批处理结果所花费的总时间 |
| NumberLong | $literal | 从查询处理开始到服务器返回第一批处理结果所花费的最长时间 |
| NumberLong | $literal | 从查询处理开始到服务器返回第一批处理结果所用的最短时间 |
| NumberDecimal | $literal | 从查询处理开始到服务器返回第一批处理结果所用时间的平方和。
|
| Date | $literal | 自上次重启以来首次使用具有给定键的查询的时间 |
| Date | $literal | 最近一次使用具有给定键的查询的时间 |
| NumberLong | $literal | 操作执行时间,不包括故意暂停,例如等待锁和流量控制的时间。 |
| 文档 | $literal | 包含在查询规划期间使用的 CBR 相关指标。 CBR 评估多个查询计划,并根据估计成本选择最有效的计划。 8.3.3版本新增。 |
| 文档 | $literal | 包含与在对具有给定键的查询进行基于费用的排名期间示例的文档数量相关的指标。 8.3.3版本新增。 |
| NumberLong | $literal | 在基于成本的排名过程中采样的文档总数。 8.3.3版本新增。 |
| NumberLong | $literal | 在基于费用的排名过程中示例的文档最大数。 8.3.3版本新增。 |
| NumberLong | $literal | 在基于成本的排名过程中取样的最小文档数。 8.3.3版本新增。 |
| NumberDecimal | $literal | 在基于成本的排名过程中取样的文档数量的平方和。
8.3.3版本新增。 |
| 文档 | $literal | 包含在基于成本的排名过程中使用的每种关联基数估计方法的计数。每个字段都表示某种特定估计方法的使用次数。 8.3.3版本新增。 |
| NumberLong | $literal | 使用基于直方图的关联基数估计的次数。 8.3.3版本新增。 |
| NumberLong | $literal | 使用基于采样的关联基数估计的次数。 8.3.3版本新增。 |
| NumberLong | $literal | 启发式基于的关联基数估计使用次数。 8.3.3版本新增。 |
| NumberLong | $literal | 使用关联基数估计的混合方法的次数。 8.3.3版本新增。 |
| NumberLong | $literal | 基于元数据的关联基数估计被使用的次数。 8.3.3版本新增。 |
| NumberLong | $literal | 使用基于代码的关联基数估计的次数。 8.3.3版本新增。 |
| 文档 | $literal | 包含与查询操作的 CPU 使用率相关的指标。本文档仅适用于Linux系统。 8.2版本新增。 |
| NumberLong | $literal | 查询操作所花费的总 CPU 时间(以纳秒为单位)。此字段仅在 Linux 系统上可用。 8.2版本新增。 |
| NumberLong | $literal | 查询操作所花费的最大 CPU 时间(以纳秒为单位)。此字段仅在 Linux 系统上可用。 8.2版本新增。 |
| NumberLong | $literal | 查询操作所花费的最短 CPU 时间(以纳秒为单位)。此字段仅在 Linux 系统上可用。 8.2版本新增。 |
| NumberDecimal | $literal | 用于查询操作的 CPU 时间的平方和。此字段仅在Linux系统上可用。
8.2版本新增。 |
| NumberLong | $literal | 本地峰值跟踪内存总和以及在查询执行期间联系的所有远程分片的峰值跟踪内存总和。 9.0版本新增。 |
| NumberLong | $literal | 本地跟踪内存使用峰值。 9.0版本新增。 |
| 文档 | $literal | 包含与在为具有给定键的查询进行查询规划期间所花费时间相关的指标。所有 8.3版本新增。 |
| NumberLong | $literal | 总查询规划时间。 8.3版本新增。 |
| NumberLong | $literal | 最大查询规划时间。 8.3版本新增。 |
| NumberLong | $literal | 最小查询规划时间。 8.3版本新增。 |
| NumberDecimal | $literal | 查询规划时间的平方和。
8.3版本新增。 |
| NumberLong | $literal | 查询操作每秒调用 8.3版本新增。 |
| NumberLong | $literal | 系统为采样查询操作延迟 8.3版本新增。 |
计划形状计数器
9.0版本新增。
metrics.queryPlanner.planShapeCounters文档记录MongoDB为具有给定键的查询选择每个计划形状的频率。使用这些计数器学习;了解您的工作负载最依赖哪些查询计划。
planShapeCounters 最多包含三个子文档,每个地图计数器名称要对其进行计数:
子文档 | 说明 |
|---|---|
| 计算每个获胜计划的总体形状。这些模式是互斥的,因此每次查询执行最多递增一个模式计数器。 |
| 计算每个获胜计划中出现的计划阶段类型。节点计数器并不互斥,因此一次查询执行可以递增其中的多个节点计数器。 |
| 计算每个获胜计划使用的数据访问路径和索引边界。访问权限路径计数器并不互斥,因此一次查询执行可以递增其中的多个计数器。 |
对于每次查询执行,每个计数器最多递增 1,即使计划多次使用相应的阶段或访问权限路径。示例,在 $or 阶段下具有 1,000 分支的计划会将匹配的 $or节点计数器加一,而不是 1,000。因此,计数器记录有多少次执行使用了一个阶段,而不是每次执行使用了多少次。
MongoDB忽略计数为零的计数器,并忽略不包含计数器的子文档。如果记录的查询均未生成计划形状计数器,MongoDB完全忽略 planShapeCounters文档。示例,通过 _id 匹配单个文档的查询使用的快速路径不匹配任何跟踪的计划结构,因此其查询统计信息条目不包含 planShapeCounters文档。
MongoDB仅记录顶级查询的计划结构计数器。示例, MongoDB不会记录$lookup 阶段外部的计数器。
模式计数器
每个模式计数器名称按顺序列出获胜计划的阶段,从访问权限路径阶段开始。示例,ixscanFetchSort 计算使用索引扫描的获胜计划,获取匹配文档,然后对它们进行排序。
模式名称粗略地描述了计划。它们省略了限制和跳过阶段,并且不区分阶段是否应用过滤或计划使用哪种类型的投影。要确定这些详细信息,请将模式计数器与 nodes 计数器以及条目的查询结构相结合。
patterns 可包含以下计数器:
访问路径 | 计数器 |
|---|---|
集合扫描 |
|
带提取的索引扫描 |
|
索引扫描 |
|
进行索引扫描而不立即提取 |
|
节点计数器
MongoDB在选择查询执行引擎后会记录节点计数器,因此计数器包括代表下推到基于插槽的引擎的聚合阶段的计划阶段。
nodes 可包含以下计数器:
计数器 | 说明 |
|---|---|
| 集合扫描阶段,根据阶段是否应用过滤单独计数。 |
| 索引扫描阶段,根据阶段是否应用过滤单独计数。 |
| 获取阶段,根据阶段是否应用过滤单独计数。 |
| 基于哈希的索引交集阶段,根据阶段是否应用过滤单独计数。 |
| 已排序索引交集阶段。 |
|
|
| 对合并阶段进行排序,根据阶段是否应用过滤以及阶段是否具有超过 100 的子阶段单独计数。 |
| 返回索引键而不是文档的阶段。 |
| 过滤分片上孤立文档的阶段。 |
| 投影阶段,按投影类型单独计数。 |
| 为排序生成排序键的阶段。 |
| 排序阶段,按排序类型和排序是否有限制分别计数。 |
| 限制阶段,按限制值单独计数。 |
| 跳过阶段,按跳过值单独计数。 |
| 合并文本搜索结果的阶段。 |
| 匹配阶段。 |
| 替换文档根目录的阶段。 |
| 小组赛阶段。 |
| 相等查找阶段,根据该阶段是否也展开结果单独计数。 |
| |
| 连接阶段,按连接算法单独计数:哈希连接、嵌套循环连接、索引嵌套循环连接和索引探测。 |
访问路径计数器
accessPaths 可包含以下计数器:
计数器 | 说明 |
|---|---|
| |
| 不获取文档的索引扫描。 |
| 用于获取文档的索引扫描。 |
| 对索引键进行计数而不返回文档的扫描。 |
| 跳过重复索引键的扫描,根据扫描是否获取文档单独计数。 |
| 地理空间邻近搜索,根据查询是使用 2d 还是 2dsphere索引单独计数。 |
| |
| 不使用集合扫描、索引扫描、计数扫描、非重复扫描或地理空间访问权限路径的获胜计划。仅执行文本搜索的计划会同时递增 |
| 索引扫描,按索引属性单独计数。单个索引扫描可以递增这些计数器的多个值。 |
| 索引扫描,按扫描使用的索引边界单独计数。当扫描使用多种类型的边界时, MongoDB会递增 |
| 字段具有多个边界的索引扫描,按边界数单独计数。 |
collectionType
key.collectionType字段表示发出记录查询的集合类型。 collectionType可以是以下值之一:
字段 | 说明 |
|---|---|
| 该查询是change stream操作。 |
| 查询是对标准集合发出的。 |
| 对不存在的collection发出查询。 |
| 该查询是对时间序列collection发出的。 |
| 查询是对视图发出的。 |
| 该查询是对虚拟集合发出的。 以下操作发生在虚拟collection中: |
查询结构
key.queryShape文档包含查询结构字段。 要学习;了解查询形状,请参阅查询形状。
key.queryShape 中的字段因生成查询统计信息条目的命令而异。 $queryStats 为aggregate、find、distinct、count、update、insert 和 delete 命令创建查询统计信息条目。
每个查询结构属性都对应一个查询选项。 例如, key.queryShape.sort对应于查询结构的sort()规范。
find 命令查询结构
下表描述了find命令的查询结构属性。
字段 | 类型 | 字面值或规范化值 |
|---|---|---|
| 文档 | 标准化 |
| 文档 | $literal |
| 文档 | 标准化 |
| 整型 | 标准化 |
| 整型 | 标准化 |
| 布尔 | $literal |
| 文档 | 标准化 |
| 文档 | 标准化 |
| 布尔 | $literal |
| 布尔 | $literal |
| 布尔 | $literal |
| 布尔 | $literal |
| 布尔 | $literal |
| 文档 | $literal |
| 布尔 | $literal |
| 文档 | 标准化 |
aggregate 命令查询结构
下表描述了aggregate命令的查询结构属性。
字段 | 类型 | 字面值或规范化值 |
|---|---|---|
| 阵列 | 标准化 |
| 布尔 | $literal |
| 布尔 | $literal |
| 布尔 | $literal |
| 文档 | $literal |
| 字符串或文档 | 标准化 |
| 文档 | 标准化 |
distinct 命令查询结构
下表描述了distinct命令的查询结构属性。
字段 | 类型 | 字面值或规范化值 |
|---|---|---|
| 文档 | 标准化 |
| 字符串 | $literal |
| 文档 | 标准化 |
count 命令查询结构
下表描述了count命令的查询结构属性。
字段 | 类型 | 字面值或规范化值 |
|---|---|---|
| 文档 | 标准化 |
| 文档 | 标准化 |
| 整型 | 标准化 |
| 整型 | 标准化 |
更新命令查询结构
9.0版本新增。
The following table describes the query shape properties for update commands. $queryStats tracks query shape statistics for each update statement in the updates array, not for the top-level update command as a whole.
字段 | 类型 | 字面值或规范化值 |
|---|---|---|
| 文档 | 标准化 |
| 文档或数组 | 标准化 |
| 文档 | 标准化 |
| 文档数组 | 标准化 |
| 布尔 | $literal |
| 布尔 | $literal |
| 文档 | 标准化 |
| 文档 | $literal |
重要
$queryStats 不会为时间序列集合上的 update 操作收集查询结构统计信息。
insert 命令查询形状
9.0版本新增。
下表描述了 insert 命令的查询结构属性。 $queryStats 为整个 insert 命令而不是 documents大量中的每个文档跟踪一次查询结构统计信息。 MongoDB始终将 documents 规范化为固定的占位符值,而无论插入的文档数量或内容如何。
字段 | 类型 | 字面值或规范化值 |
|---|---|---|
| 阵列 | 标准化 |
重要
$queryStats 不会为时间序列集合上的 insert 操作收集查询结构统计信息。
删除命令查询结构
9.0版本新增。
The following table describes the query shape properties for delete commands. $queryStats tracks query shape statistics for each delete statement in the deletes array, not for the top-level delete command as a whole.
key.queryShape.limit 反映删除声明的 limit字段,其中 0 删除所有匹配的文档,1 删除单个文档。它不限制查询统计信息条目的数量。
字段 | 类型 | 字面值或规范化值 |
|---|---|---|
| 文档 | 标准化 |
| 整型 | $literal |
| 文档 | 标准化 |
| 文档 | $literal |
重要
$queryStats 不会为时间序列集合上的 delete 操作收集查询结构统计信息。
补充指标
查询统计信息条目可能包含一个 metrics.supplementalMetrics文档,其中提供了有关查询的其他信息。
$vectorSearch 指标
如果您的查询结构包含 $vectorSearch,则 $queryStats 输出以下补充指标:
字段 | 类型 | 说明 |
|---|---|---|
| 文档 | 有关 |
| 文档 | 与 |
| 文档 | 与 |
示例
要运行本节中的示例,请从以下数据开始:
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") }, planningTimeMicros: { sum: Long("2150"), max: Long("2150"), min: Long("2150"), sumOfSquares: Decimal128("4622500") }, costBasedRanker: { cardinalityEstimationMethods: { Histogram: Long("0"), Sampling: Long("0"), Heuristics: Long("0"), Mixed: Long("0"), Metadata: Long("0"), Code: Long("0") }, nDocsSampled: { sum: Long("0"), max: Long("0"), min: Long("0"), sumOfSquares: Decimal128("0") } }, 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") }, planningTimeMicros: { sum: Long("1850"), max: Long("850"), min: Long("420"), sumOfSquares: Decimal128("1252500") }, costBasedRanker: { cardinalityEstimationMethods: { Histogram: Long("0"), Sampling: Long("0"), Heuristics: Long("0"), Mixed: Long("0"), Metadata: Long("0"), Code: Long("0") }, nDocsSampled: { sum: Long("0"), max: Long("0"), min: Long("0"), sumOfSquares: Decimal128("0") } }, 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") }, planningTimeMicros: { sum: Long("2150"), max: Long("2150"), min: Long("2150"), sumOfSquares: Decimal128("4622500") }, costBasedRanker: { cardinalityEstimationMethods: { Histogram: Long("0"), Sampling: Long("0"), Heuristics: Long("0"), Mixed: Long("0"), Metadata: Long("0"), Code: Long("0") }, nDocsSampled: { sum: Long("0"), max: Long("0"), min: Long("0"), sumOfSquares: Decimal128("0") } }, 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") }, planningTimeMicros: { sum: Long("1850"), max: Long("850"), min: Long("420"), sumOfSquares: Decimal128("1252500") }, costBasedRanker: { cardinalityEstimationMethods: { Histogram: Long("0"), Sampling: Long("0"), Heuristics: Long("0"), Mixed: Long("0"), Metadata: Long("0"), Code: Long("0") }, nDocsSampled: { sum: Long("0"), max: Long("0"), min: Long("0"), sumOfSquares: Decimal128("0") } }, 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 collection
MongoDB Atlas 定期使用$queryStats收集有关查询的匿名数据,这有助于改进 MongoDB 产品。 您的数据还可能用于根据使用情况提出功能建议。 MongoDB 将通过$queryStats收集的数据保留四年。
当 Atlas 在部署上运行$queryStats时,它会为每个 Atlas 组织使用唯一的 HMAC 密钥来转换您的数据并避免收集敏感信息。