对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Docs 菜单

$queryStats(聚合阶段)

$queryStats

警告

$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 采用以下字段:

字段
必要性
类型
说明

transformIdentifiers

Optional

文档

为$queryStats输出指定其他转换选项。

transformIdentifiers
.algorithm

如果指定transformIdentifiers对象,则为必填项

字符串

应用于输出中的命名空间信息和字段名称的哈希转换类型。 当前唯一支持的algorithm值为hmac-sha-256 。

transformIdentifiers
.hmacKey

如果指定transformIdentifiers对象,则为必填项

BinData

HMAC 转换中输入的私钥。

如果您的部署强制执行访问控制,则运行$queryStats的用户必须具有以下权限:

内置clusterMonitor角色提供queryStatsRead和queryStatsReadTransformed权限。以下示例授予对admin数据库的clusterMonitor角色:

db.grantRolesToUser(
"<user>",
[ { role: "clusterMonitor", db: "admin" } ]
)

以下部分描述了$queryStats阶段的行为细节。

$queryStats阶段的统计信息在内存中存储的虚拟集合中进行跟踪。 虚拟collection的内存限制为系统总内存的 1%。

9.0版本新增。

从MongoDB 9.0 开始,$queryStats默认收集 1%写入操作示例的统计数据。要更改采样率,请为读取操作设立internalQueryStatsSampleRate 参数,或为写入操作设置 internalQueryStatsWriteCmdSampleRate 参数。这两个参数都接受 0.0 和 1.0 之间的值。

由于 $queryStats 仅报告MongoDB采样的操作,因此其输出表示针对您的部署运行的操作的子集。计数和执行时间仅反映采样的操作。

$queryStats 将具有共同属性的查询分组到同一输出文档中。 生成的文档称为查询统计条目。

$queryStats 通过将用户提供的字段值规范化为其数据类型,将类似的查询分组在一起。 例如,指定为{ item: 'card' }的筛选器将规范化为{ item : '?string'} 。 $queryStats还会规范化某些查询选项(如hint和comment的值。

$queryStats 保留readConcern和readPreference等选项的字面值。

有关查询统计条目中包含的完整选项列表,请参阅find 命令查询结构。

当为transformIdentifiers选项指定了 HMAC 密钥时, $queryStats使用该 HMAC 密钥对以下数据应用 HMAC-SHA-256 哈希函数:

  • 文档字段名称

  • 集合名称

  • 数据库名称

$queryStats 不会对以下数据应用 HMAC 转换:

  • MQL 关键字,例如操作符名称(例如$gte )。

  • 参数名称,例如$setWindowFields中的partitionBy参数。

  • 字段值。 $queryStats在记录查询时将查询中的字段值规范为其数据类型(例如数字或字符串)。 $queryStats从不存储包含用户数据的字段值。

有关转换后的输出的示例,请参阅转换后的示例。

MongoDB在部署日志中记录$queryStats操作。 默认, MongoDB仅记录$queryStats操作的调用,而不记录操作的输出。 对于包含transformIdentifiers选项的$queryStats操作,您可以指定日志条目中是否包含转换后的输出。

要了解如何控制$queryStats日志行为,请参阅切换 $queryStats 日志输出。

发生以下事件之一时,变更流的查询统计信息会更新:

  • 创建游标

  • getMore操作完成

  • 游标关闭

为变更流报告的查询统计信息具有以下行为:

  • totalExecMicros等执行指标包含最近操作(游标创建、 getMore或游标关闭)的信息。

  • 内部getMore操作会递增execCount指标。

  • firstResponseExecMicros 和totalExecMicros始终相同,因为会为每个getMore操作收集和更新统计信息。

  • 当游标关闭时, lastExecutionMicros为0 。

8.3版本新增。

在分片的集群中,启用 $queryStats 后, MongoDB会分别记录每个 mongod 和 mongos 的查询统计信息。分片服务器还记录源自 mongos 的查询的统计信息。这些为用户通过 mongos 路由的查询提供了更完整的分片级指标。

$queryStats 返回查询统计信息条目的数组。 某些查询统计信息条目属性包含字面值,某些属性已标准化以对常见查询进行分组。

注意

MongoDB 9.0 更新 $queryStats 输出结构以改进指标组织。

查询统计信息条目包含以下顶级文档:

文档
说明

key

用于定义查询统计信息输出中的条目的唯一属性组合。 key包含以下属性:

每个唯一的属性组合都会在$queryStats虚拟collection中创建一个单独的条目。

asOf

$queryStats从$queryStats虚拟collection中读取此条目时的 UTC 时间。asOf不一定会为每个结果返回相同的 UTC 时间。 在内部,数据结构被分区,每个分区将在单独的时间点读取。

metrics

包含与每个查询统计信息条目关联的聚合运行时指标。 每个查询统计信息条目都记录共享相同密钥的每个查询的统计信息。

输出数组中的每个文档都包含以下字段:

字段
类型
字面值或规范化值
说明

key

文档

$literal

包含查询结构和将一组查询分组在一起的其他查询属性

key.queryShape

文档

$literal

包含用于将相似查询群组在一起的属性。 有关详细信息,请参阅查询结构。

key.client

文档

$literal

描述与密钥关联的客户端信息

key.client.application

文档

$literal

客户端应用程序名称

key.client.driver

文档

$literal

描述用于发出查询的驱动程序

key.client.driver.name

字符串

$literal

用于发出查询的驱动程序的名称。 可能的值包括mongosh和nodejs 。

key.client.driver.version

字符串

$literal

用于发出查询的驱动程序的版本号

key.client.os

文档

$literal

描述发出查询的客户端使用的操作系统

key.client.os.type

字符串

$literal

操作系统类型

key.client.os.name

字符串

$literal

操作系统名称

key.client.os.architecture

字符串

$literal

操作系统的架构。 可能的值包括arm64和x86_64 。

key.client.os.version

字符串

$literal

操作系统的版本号

key.readConcern

文档

$literal

key.collectionType

字符串

$literal

发出查询的集合类型。 有关详细信息,请参阅集合类型。

key.hint

文档或字符串

标准化

用作查询提示的索引

key.batchSize

字符串

标准化

键的批处理大小。批处理大小指定批处理查询结果中可以返回的最大文档数。默认下,初始批处理大小为 101 个文档或 16 兆字节 (MiB) 文档中较小的值。后续批次的最大大小为 16 MiB。batchSize 可以实施小于 16 MiB 的限制,但不能执行大于 MiB 的限制。设立为 batchSize 后, 是 batchSize 个文档或价值 16 MiB 的文档中较小的一个。

key.comment

字符串

标准化

与键关联的注释

key.maxTimeMS

字符串

标准化

与键关联的maxTimeMS值

key.noCursorTimeout

布尔

标准化

与键关联的noCursorTimeout选项

key.readPreference

字符串

$literal

key.apiVersion

字符串

$literal

key.apiStrict

布尔

$literal

与键关联的apiStrict参数值。 请参阅stable API 参数。

key.apiDeprecationErrors

布尔

$literal

与键关联的apiDeprecationErrors参数值。 请参阅stable API 参数。

keyHash

字符串

$literal

key中值的哈希表示。 每个唯一的keyHash值对应于$queryStats内存存储中的一个唯一条目。

queryShapeHash

字符串

$literal

8.0版本新增。

queryShapeHash 是一个十六进制string ,具有查询结构的哈希值。 有关详细信息,请参阅查询形状。

metrics

文档

$literal

描述密钥的运行时统计信息

metrics.cursor

文档

$literal

9.0版本新增。

与游标和批处理协议相关的指标

metrics
.cursor
.firstResponseExecMicros

文档

$literal

在版本9.0中进行了更改。

描述从键内的查询开始处理到服务器返回第批处理结果所花费的时间

firstResponseExecMicros的所有子字段均以微秒为单位报告。

metrics.queryExec

文档

$literal

9.0版本新增。

与查询执行相关的指标

metrics
.queryExec
.docsReturned

文档

$literal

在版本9.0中进行了更改。

描述键内查询返回的文档数量

metrics
.queryExec
.docsReturned
.sum

NumberLong

$literal

使用给定键的查询返回的文档总数

metrics
.queryExec
.docsReturned
.max

NumberLong

$literal

使用给定键的查询返回的最大文档数

metrics
.queryExec
.docsReturned
.min

NumberLong

$literal

使用给定键的查询返回的最少文档数

metrics
.queryExec
.docsReturned
.sumOfSquares

NumberDecimal

$literal

查询在键内返回的文档数量的平方和。

sumOfSquares值较高表示各个查询之间返回的文档数量差异较大。

metrics
.queryExec
.keysExamined

文档

$literal

描述查询检查的键的数量

metrics
.queryExec
.keysExamined
.sum

整型

$literal

检查的键总数

metrics
.queryExec
.keysExamined
.max

NumberLong

$literal

检查的最大键数

metrics
.queryExec
.keysExamined
.min

NumberLong

$literal

检查的键数量最少

metrics
.queryExec
.keysExamined
.sumOfSquares

NumberDecimal

$literal

检查的键数量的平方和。

sumOfSquares值较高表示各个查询中检查的键数量差异较大。

metrics
.queryExec
.docsExamined

文档

$literal

在版本9.0中进行了更改。

描述查询检查的文档数量

metrics
.queryExec
.docsExamined
.sum

整型

$literal

查询中检查的文档总数

metrics
.queryExec
.docsExamined
.max

NumberLong

$literal

检查的最大文档数

metrics
.queryExec
.docsExamined
.min

NumberLong

$literal

最少检查文件数量

metrics
.queryExec
.docsExamined
.sumOfSquares

NumberDecimal

$literal

检查的文档数量的平方和。

sumOfSquares值较高表示各个查询中检查的文档数量差异较大。

metrics
.queryExec
.bytesRead

文档

$literal

在版本9.0中进行了更改。

描述查询读取的字节数

metrics
.queryExec
.bytesRead
.sum

整型

$literal

查询中读取的总字节数

metrics
.queryExec
.bytesRead
.max

NumberLong

$literal

读取的最大字节数

metrics
.queryExec
.bytesRead
.min

NumberLong

$literal

读取的最小字节数

metrics
.queryExec
.bytesRead
.sumOfSquares

NumberDecimal

$literal

读取字节数的平方和

metrics
.queryExec
.readTimeMicros

文档

$literal

在版本9.0中进行了更改。

描述查询的读取时间(以微秒为单位)

metrics
.queryExec
.readTimeMicros
.sum

整型

$literal

查询的总读取时间(以微秒为单位)

metrics
.queryExec
.readTimeMicros
.max

NumberLong

$literal

查询的最长读取时间(以微秒为单位)

metrics
.queryExec
.readTimeMicros
.min

NumberLong

$literal

查询的最小读取时间(以微秒为单位)

metrics
.queryExec
.readTimeMicros
.sumOfSquares

NumberDecimal

$literal

查询读取时间的平方和(以微秒为单位)

metrics
.queryExec
.delinquentAcquisitions

NumberLong

$literal

在版本9.0中进行了更改。

查询操作超过预期执行票证获取时间的次数。

metrics
.queryExec
.totalAcquisitionDelinquencyMillis

NumberLong

$literal

在版本9.0中进行了更改。

查询操作超过预期执行票证获取时间的总时间(以毫秒为单位)。

metrics
.queryExec
.maxAcquisitionDelinquencyMillis

NumberLong

$literal

在版本9.0中进行了更改。

查询操作超过预期执行票证获取时间的最长持续时间(以毫秒为单位)。

metrics.lastExecutionMicros

NumberLong

$literal

具有给定键的所有查询的最新查询的执行运行时

metrics.execCount

NumberLong

$literal

已执行具有给定键的查询的次数

metrics.queryPlanner

文档

$literal

在版本9.0中进行了更改。

与查询计划相关的指标

metrics
.queryPlanner
.hasSortStage

文档

$literal

在版本9.0中进行了更改。

包含两个字段的对象:true 和 false。每个字段计算匹配查询的数量,其中 hasSortStage 的值分别为 true 或 false。

hasSortStage 当MongoDB在从游标接收到文档后必须对文档进行排序时,为 true。

metrics
.queryPlanner
.usedDisk

文档

$literal

在版本9.0中进行了更改。

包含两个字段的对象:true 和 false。每个字段计算匹配查询的数量,其中 usedDisk 的值分别为 true 或 false。

usedDisk 为 true,当查询由于内存限制而将数据写入临时文件时。

metrics
.queryPlanner
fromMultiPlanner

文档

$literal

在版本9.0中进行了更改。

包含两个字段的对象:true 和 false。每个字段计算匹配查询的数量,其中 fromMultiPlanner 的值分别为 true 或 false。

fromMultiPlanner 如果查询规划器在为查询选择获胜执行计划之前评估多个计划,则为 true。

metrics
.queryPlanner
fromPlanCache

文档

$literal

在版本9.0中进行了更改。

包含两个字段的对象:true 和 false。每个字段计算匹配查询的数量,其中 fromPlanCache 的值分别为 true 或 false。

fromPlanCache 当查询规划器能够使用计划缓存中的计划时,为 true。

metrics
.queryPlanner
.planShapeCounters

文档

$literal

9.0版本新增。

MongoDB为具有给定键的查询选择的计划形状的计数。有关详细信息,请参阅规划形状计数器。

metrics
.queryPlanner
.planShapeCounters
.patterns

文档

$literal

9.0版本新增。

获胜方案的总体形状计数。每个获胜计划最多匹配一个模式。

metrics
.queryPlanner
.planShapeCounters
.nodes

文档

$literal

9.0版本新增。

获胜计划中出现的计划阶段类型的计数。一个获胜计划可以匹配多个节点计数器。

metrics
.queryPlanner
.planShapeCounters
.accessPaths

文档

$literal

9.0版本新增。

获胜计划使用的数据访问路径和索引边界的计数。一个获胜计划可以匹配多个访问权限路径计数器。

metrics.writes

文档

$literal

在版本9.0中进行了更改。

与写入相关的指标

metrics
.writes
nMatched

NumberLong

$literal

9.0版本新增。

更新选择的文档数量

metrics
.writes
nUpserted

NumberLong

$literal

9.0版本新增。

更新操作插入的文档数

metrics
.writes
nModified

NumberLong

$literal

9.0版本新增。

更新操作修改的文档数

metrics
.writes
nDeleted

NumberLong

$literal

9.0版本新增。

更新操作删除的文档数

metrics
.writes
nInserted

NumberLong

$literal

9.0版本新增。

更新操作插入的文档数,不包括更新或插入

metrics
.writes
nUpdateOps

NumberLong

$literal

9.0版本新增。

原始更新请求中的更新次数

metrics.totalExecMicros

文档

$literal

描述使用给定键运行查询所花费的总时间。 如果查询结果为getMores ,则totalExecMicros包括处理getMore请求所花费的时间。 totalExecMicros不包括等待客户端所花费的时间。

totalExecMicros的所有子字段均以微秒为单位报告。

metrics
.totalExecMicros
.sum

NumberLong

$literal

使用给定键运行查询所花费的总时间

metrics
.totalExecMicros
.max

NumberLong

$literal

使用给定键运行查询所花费的最长时间

metrics
.totalExecMicros
.min

NumberLong

$literal

使用给定键运行查询所花费的最短时间

metrics
.totalExecMicros
.sumOfSquares

NumberDecimal

$literal

具有给定键的所有查询的总执行时间的平方和。 sumOfSquares值较高表示查询执行时间的差异较大。

metrics
.cursor
.firstResponseExecMicros
.sum

NumberLong

$literal

从查询处理开始到服务器返回第一批处理结果所花费的总时间

metrics
.cursor
.firstResponseExecMicros
.max

NumberLong

$literal

从查询处理开始到服务器返回第一批处理结果所花费的最长时间

metrics
.cursor
.firstResponseExecMicros
.min

NumberLong

$literal

从查询处理开始到服务器返回第一批处理结果所用的最短时间

metrics
.cursor
.firstResponseExecMicros
.sumOfSquares

NumberDecimal

$literal

从查询处理开始到服务器返回第一批处理结果所用时间的平方和。

sumOfSquares值较高表示查询处理时间的差异较大。

metrics.firstSeenTimestamp

Date

$literal

自上次重启以来首次使用具有给定键的查询的时间

metrics.latestSeenTimestamp

Date

$literal

最近一次使用具有给定键的查询的时间

metrics.workingTimeMillis

NumberLong

$literal

操作执行时间,不包括故意暂停,例如等待锁和流量控制的时间。

metrics
.costBasedRanker

文档

$literal

包含在查询规划期间使用的 CBR 相关指标。 CBR 评估多个查询计划,并根据估计成本选择最有效的计划。

8.3.3版本新增。

metrics
.costBasedRanker
.nDocsSampled

文档

$literal

包含与在对具有给定键的查询进行基于费用的排名期间示例的文档数量相关的指标。

8.3.3版本新增。

metrics
.costBasedRanker
.nDocsSampled
.sum

NumberLong

$literal

在基于成本的排名过程中采样的文档总数。

8.3.3版本新增。

metrics
.costBasedRanker
.nDocsSampled
.max

NumberLong

$literal

在基于费用的排名过程中示例的文档最大数。

8.3.3版本新增。

metrics
.costBasedRanker
.nDocsSampled
.min

NumberLong

$literal

在基于成本的排名过程中取样的最小文档数。

8.3.3版本新增。

metrics
.costBasedRanker
.nDocsSampled
.sumOfSquares

NumberDecimal

$literal

在基于成本的排名过程中取样的文档数量的平方和。

sumOfSquares值较高表示对单个查询进行采样的文档数量差异较大。

8.3.3版本新增。

metrics
.costBasedRanker
.cardinalityEstimationMethods

文档

$literal

包含在基于成本的排名过程中使用的每种关联基数估计方法的计数。每个字段都表示某种特定估计方法的使用次数。

8.3.3版本新增。

metrics
.costBasedRanker
.cardinalityEstimationMethods
.Histogram

NumberLong

$literal

使用基于直方图的关联基数估计的次数。

8.3.3版本新增。

metrics
.costBasedRanker
.cardinalityEstimationMethods
.Sampling

NumberLong

$literal

使用基于采样的关联基数估计的次数。

8.3.3版本新增。

metrics
.costBasedRanker
.cardinalityEstimationMethods
.Heuristics

NumberLong

$literal

启发式基于的关联基数估计使用次数。

8.3.3版本新增。

metrics
.costBasedRanker
.cardinalityEstimationMethods
.Mixed

NumberLong

$literal

使用关联基数估计的混合方法的次数。

8.3.3版本新增。

metrics
.costBasedRanker
.cardinalityEstimationMethods
.Metadata

NumberLong

$literal

基于元数据的关联基数估计被使用的次数。

8.3.3版本新增。

metrics
.costBasedRanker
.cardinalityEstimationMethods
.Code

NumberLong

$literal

使用基于代码的关联基数估计的次数。

8.3.3版本新增。

metrics
.cpuNanos

文档

$literal

包含与查询操作的 CPU 使用率相关的指标。本文档仅适用于Linux系统。

8.2版本新增。

metrics
.cpuNanos
.sum

NumberLong

$literal

查询操作所花费的总 CPU 时间(以纳秒为单位)。此字段仅在 Linux 系统上可用。

8.2版本新增。

metrics
.cpuNanos
.max

NumberLong

$literal

查询操作所花费的最大 CPU 时间(以纳秒为单位)。此字段仅在 Linux 系统上可用。

8.2版本新增。

metrics
.cpuNanos
.min

NumberLong

$literal

查询操作所花费的最短 CPU 时间(以纳秒为单位)。此字段仅在 Linux 系统上可用。

8.2版本新增。

metrics
.cpuNanos
.sumOfSquares

NumberDecimal

$literal

用于查询操作的 CPU 时间的平方和。此字段仅在Linux系统上可用。

sumOfSquares 值较高表示各个查询的 CPU 时间差异较大。

8.2版本新增。

metrics
.clusterPeakTrackedMemBytes

NumberLong

$literal

本地峰值跟踪内存总和以及在查询执行期间联系的所有远程分片的峰值跟踪内存总和。

9.0版本新增。

metrics
.peakTrackedMemBytes

NumberLong

$literal

本地跟踪内存使用峰值。

9.0版本新增。

metrics
.planningTimeMicros

文档

$literal

包含与在为具有给定键的查询进行查询规划期间所花费时间相关的指标。所有 planningTimeMicros 子字段均以微秒为单位报告。

8.3版本新增。

metrics
.planningTimeMicros
.sum

NumberLong

$literal

总查询规划时间。

8.3版本新增。

metrics
.planningTimeMicros
.max

NumberLong

$literal

最大查询规划时间。

8.3版本新增。

metrics
.planningTimeMicros
.min

NumberLong

$literal

最小查询规划时间。

8.3版本新增。

metrics
.planningTimeMicros
.sumOfSquares

NumberDecimal

$literal

查询规划时间的平方和。

sumOfSquares 值较高表示各个查询的规划时间差异较大。

8.3版本新增。

metrics
.numInterruptChecksPerSec

NumberLong

$literal

查询操作每秒调用 checkForInterrupt 的次数。如果您使用getMores分批运行查询,则该指标将变为聚合指标。

8.3版本新增。

metrics
.overdueInterruptApproxMaxMillis

NumberLong

$literal

系统为采样查询操作延迟 checkForInterrupt 的最大毫秒数。

8.3版本新增。

9.0版本新增。

metrics.queryPlanner.planShapeCounters文档记录MongoDB为具有给定键的查询选择每个计划形状的频率。使用这些计数器学习;了解您的工作负载最依赖哪些查询计划。

planShapeCounters 最多包含三个子文档,每个地图计数器名称要对其进行计数:

子文档
说明

patterns

计算每个获胜计划的总体形状。这些模式是互斥的,因此每次查询执行最多递增一个模式计数器。

nodes

计算每个获胜计划中出现的计划阶段类型。节点计数器并不互斥,因此一次查询执行可以递增其中的多个节点计数器。

accessPaths

计算每个获胜计划使用的数据访问路径和索引边界。访问权限路径计数器并不互斥,因此一次查询执行可以递增其中的多个计数器。

对于每次查询执行,每个计数器最多递增 1,即使计划多次使用相应的阶段或访问权限路径。示例,在 $or 阶段下具有 1,000 分支的计划会将匹配的 $or节点计数器加一,而不是 1,000。因此,计数器记录有多少次执行使用了一个阶段,而不是每次执行使用了多少次。

MongoDB忽略计数为零的计数器,并忽略不包含计数器的子文档。如果记录的查询均未生成计划形状计数器,MongoDB完全忽略 planShapeCounters文档。示例,通过 _id 匹配单个文档的查询使用的快速路径不匹配任何跟踪的计划结构,因此其查询统计信息条目不包含 planShapeCounters文档。

MongoDB仅记录顶级查询的计划结构计数器。示例, MongoDB不会记录$lookup 阶段外部的计数器。

每个模式计数器名称按顺序列出获胜计划的阶段,从访问权限路径阶段开始。示例,ixscanFetchSort 计算使用索引扫描的获胜计划,获取匹配文档,然后对它们进行排序。

模式名称粗略地描述了计划。它们省略了限制和跳过阶段,并且不区分阶段是否应用过滤或计划使用哪种类型的投影。要确定这些详细信息,请将模式计数器与 nodes 计数器以及条目的查询结构相结合。

patterns 可包含以下计数器:

访问路径
计数器

集合扫描

  • collscan

  • collscanProject

  • collscanProjectSort

  • collscanProjectSortProject

  • collscanSort

  • collscanSortProject

  • collscanSortProjectSort

带提取的索引扫描

  • ixscanFetch

  • ixscanFetchProject

  • ixscanFetchProjectSort

  • ixscanFetchProjectSortProject

  • ixscanFetchSort

  • ixscanFetchSortProject

  • ixscanFetchSortProjectSort

  • ixscanFetchSortMerge

  • ixscanFetchSortMergeProject

索引扫描 $or

  • ixscanFetchOr

  • ixscanFetchOrProject

  • ixscanFetchOrProjectSort

  • ixscanFetchOrSort

  • ixscanFetchOrSortProject

  • ixscanOrFetch

  • ixscanOrFetchProject

  • ixscanOrFetchProjectSort

  • ixscanOrFetchSort

  • ixscanOrFetchSortProject

  • ixscanOrProject

  • ixscanOrProjectSort

进行索引扫描而不立即提取

  • ixscanProject

  • ixscanProjectSort

  • ixscanProjectSortProject

  • ixscanSortFetch

  • ixscanSortFetchProject

  • ixscanSortMergeFetch

  • ixscanSortMergeFetchProject

  • ixscanSortMergeProject

MongoDB在选择查询执行引擎后会记录节点计数器,因此计数器包括代表下推到基于插槽的引擎的聚合阶段的计划阶段。

nodes 可包含以下计数器:

计数器
说明

collscanNoFilter
collscanWithFilter

集合扫描阶段,根据阶段是否应用过滤单独计数。

ixscanNoFilter
ixscanWithFilter

索引扫描阶段,根据阶段是否应用过滤单独计数。

fetchNoFilter
fetchWithFilter

获取阶段,根据阶段是否应用过滤单独计数。

andHashNoFilter
andHashWithFilter

基于哈希的索引交集阶段,根据阶段是否应用过滤单独计数。

andSorted

已排序索引交集阶段。

orNoFilterLte100Children
orWithFilterLte100Children
orNoFilterGt100Children
orWithFilterGt100Children

$or 阶段,根据该阶段是否应用过滤以及该阶段是否有超过 100 的子阶段单独计数。

sortMergeNoFilterLte100Children
sortMergeWithFilterLte100Children
sortMergeNoFilterGt100Children
sortMergeWithFilterGt100Children

对合并阶段进行排序,根据阶段是否应用过滤以及阶段是否具有超过 100 的子阶段单独计数。

returnKey

返回索引键而不是文档的阶段。

shardingFilter

过滤分片上孤立文档的阶段。

projectionDefault
projectionCovered
projectionSimple

投影阶段,按投影类型单独计数。

sortKeyGenerator

为排序生成排序键的阶段。

sortDefaultNoLimit
sortDefaultWithLimit
sortSimpleNoLimit
sortSimpleWithLimit

排序阶段,按排序类型和排序是否有限制分别计数。

limitSmall
limitMedium
limitLarge

限制阶段,按限制值单独计数。 limitSmall 对 100 或以下的限值进行计数,limitMedium 对从 101 到 10、000 的限值进行计数,limitLarge 对大于 10、000 的限值进行计数。

skipSmall
skipMedium
skipLarge

跳过阶段,按跳过值单独计数。 skipSmall 计数 100 或以下的跳跃,skipMedium 计数从 101 到 10、000 的跳跃,skipLarge 计数大于 10、000 的跳跃。

textOr

合并文本搜索结果的阶段。

match

匹配阶段。

replaceRoot

替换文档根目录的阶段。

group

小组赛阶段。

eqLookupNoUnwind
eqLookupWithUnwind

相等查找阶段,根据该阶段是否也展开结果单独计数。

unpackTsBucket

解压缩时间序列存储桶的阶段。

hashJoin
nlj
inlj
indexProbe

连接阶段,按连接算法单独计数:哈希连接、嵌套循环连接、索引嵌套循环连接和索引探测。

accessPaths 可包含以下计数器:

计数器
说明

collscan
clusteredCollscan

coveredIxscan

不获取文档的索引扫描。

ixscanFetch

用于获取文档的索引扫描。

countScan

对索引键进行计数而不返回文档的扫描。

distinctScan
distinctScanFetch

跳过重复索引键的扫描,根据扫描是否获取文档单独计数。

geoNear2d
geoNear2dSphere

地理空间邻近搜索,根据查询是使用 2d 还是 2dsphere索引单独计数。

textMatch

otherAccessPath

不使用集合扫描、索引扫描、计数扫描、非重复扫描或地理空间访问权限路径的获胜计划。仅执行文本搜索的计划会同时递增 textMatch 和 otherAccessPath。

btreeIxscan
wildcardIxscan
sparseIxscan
uniqueIxscan
hashedIxscan
multikeyIxscan

索引扫描,按索引属性单独计数。单个索引扫描可以递增这些计数器的多个值。

boundsFullScan
boundsPoint
boundsBoundedRange
boundsMinKeyToValue
boundsValueToMaxKey
boundsMixture

索引扫描,按扫描使用的索引边界单独计数。当扫描使用多种类型的边界时, MongoDB会递增 boundsMixture。

boundsUnionedSmall
boundsUnionedLarge

字段具有多个边界的索引扫描,按边界数单独计数。 boundsUnionedSmall 对具有 2 到 50 边界的字段进行计数,boundsUnionedLarge 对具有 51 或更多边界的字段进行计数。

key.collectionType字段表示发出记录查询的集合类型。 collectionType可以是以下值之一:

字段
说明

changeStream

collection

查询是对标准集合发出的。

nonExistent

对不存在的collection发出查询。

timeseries

view

查询是对视图发出的。

virtual

该查询是对虚拟集合发出的。 以下操作发生在虚拟collection中:

key.queryShape文档包含查询结构字段。 要学习;了解查询形状,请参阅查询形状。

key.queryShape 中的字段因生成查询统计信息条目的命令而异。 $queryStats 为aggregate、find、distinct、count、update、insert 和 delete 命令创建查询统计信息条目。

每个查询结构属性都对应一个查询选项。 例如, key.queryShape.sort对应于查询结构的sort()规范。

下表描述了find命令的查询结构属性。

字段
类型
字面值或规范化值

key.queryShape.filter

文档

标准化

key.queryShape.sort

文档

$literal

key.queryShape.projection

文档

标准化

key.queryShape.skip

整型

标准化

key.queryShape.limit

整型

标准化

key.queryShape.singleBatch

布尔

$literal

key.queryShape.max

文档

标准化

key.queryShape.min

文档

标准化

key.queryShape.returnKey

布尔

$literal

key.queryShape.showRecordId

布尔

$literal

key.queryShape.tailable

布尔

$literal

key.queryShape.oplogReplay

布尔

$literal

key.queryShape.awaitData

布尔

$literal

key.queryShape.collation

文档

$literal

key.queryShape.allowDiskUse

布尔

$literal

key.queryShape.let

文档

标准化

下表描述了aggregate命令的查询结构属性。

字段
类型
字面值或规范化值

key.queryShape.pipeline

阵列

标准化

key.queryShape.explain

布尔

$literal

key.queryShape.allowDiskUse

布尔

$literal

key.queryShape.allowPartialResults

布尔

$literal

key.queryShape.collation

文档

$literal

key.queryShape.hint

字符串或文档

标准化

key.queryShape.let

文档

标准化

下表描述了distinct命令的查询结构属性。

字段
类型
字面值或规范化值

key.queryShape.collation

文档

标准化

key.queryShape.key

字符串

$literal

key.queryShape.query

文档

标准化

下表描述了count命令的查询结构属性。

字段
类型
字面值或规范化值

key.queryShape.collation

文档

标准化

key.queryShape.query

文档

标准化

key.queryShape.limit

整型

标准化

key.queryShape.skip

整型

标准化

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.

字段
类型
字面值或规范化值

key.queryShape.q

文档

标准化

key.queryShape.u

文档或数组

标准化

key.queryShape.c

文档

标准化

key.queryShape.arrayFilters

文档数组

标准化

key.queryShape.multi

布尔

$literal

key.queryShape.upsert

布尔

$literal

key.queryShape.let

文档

标准化

key.queryShape.collation

文档

$literal

重要

$queryStats 不会为时间序列集合上的 update 操作收集查询结构统计信息。

9.0版本新增。

下表描述了 insert 命令的查询结构属性。 $queryStats 为整个 insert 命令而不是 documents大量中的每个文档跟踪一次查询结构统计信息。 MongoDB始终将 documents 规范化为固定的占位符值,而无论插入的文档数量或内容如何。

字段
类型
字面值或规范化值

key.queryShape.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 删除单个文档。它不限制查询统计信息条目的数量。

字段
类型
字面值或规范化值

key.queryShape.q

文档

标准化

key.queryShape.limit

整型

$literal

key.queryShape.let

文档

标准化

key.queryShape.collation

文档

$literal

重要

$queryStats 不会为时间序列集合上的 delete 操作收集查询结构统计信息。

查询统计信息条目可能包含一个 metrics.supplementalMetrics文档,其中提供了有关查询的其他信息。

如果您的查询结构包含 $vectorSearch,则 $queryStats 输出以下补充指标:

字段
类型
说明

metrics
.supplementalMetrics
.vectorSearch

文档

有关 $vectorSearch聚合阶段的补充指标

metrics
.supplementalMetrics
.vectorSearch
.limit

文档

与 $vectorSearch聚合阶段的 limit 值相关的指标

metrics
.supplementalMetrics
.vectorSearch
.numCandidatesLimitRatio

文档

与 $vectorSearch聚合阶段的 numCandidates 值相关的指标。$queryStats 将这些指标表示为 numCandidates 除以 limit 值的比率。

要运行本节中的示例,请从以下数据开始:

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 定期使用$queryStats收集有关查询的匿名数据,这有助于改进 MongoDB 产品。 您的数据还可能用于根据使用情况提出功能建议。 MongoDB 将通过$queryStats收集的数据保留四年。

当 Atlas 在部署上运行$queryStats时,它会为每个 Atlas 组织使用唯一的 HMAC 密钥来转换您的数据并避免收集敏感信息。