对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

$queryStats(聚合阶段)

$queryStats

警告

$queryStats聚合阶段不受支持,也不能保证在未来版本中保持稳定。 不要构建依赖于此阶段的特定输出格式的功能,因为输出可能会在将来的版本中发生变化。

返回已记录查询的运行时统计信息。

$queryStats 收集并报告 aggregate()、find()、distinct()、count()、update()、insert()、deleteOne() 和 deleteMany() 查询的指标。$queryStats 不会收集使用 Queryable Encryption 的查询信息。

The $queryStats stage is enabled on deployments hosted on MongoDB Atlas with a cluster tier of at least M10.

要运行$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 records $queryStats operations in the deployment logs. By default, MongoDB only logs the invocation of $queryStats operations, not the operation's output. For $queryStats operations that include the transformIdentifiers option, you can specify whether the transformed output is included in the log entry.

要了解如何控制$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

Contains attributes used to group similar queries together. For more information, see Query Shape.

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

The type of collection the query was issued on. For more information, see Collection Type.

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

与该密钥关联的 Stable API 版本。请参阅 MongoDB Stable API for 服务器 Upgrades。

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版本新增。

Counts of the plan shapes that MongoDB selected for queries with the given key. For details, see Plan Shape Counters.

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,而不是 1,000。因此,计数器记录的是有多少次执行使用了某个阶段,而不是每次执行使用了多少次。

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

MongoDB 记录仅针对顶级查询的计划形状计数器。示例,MongoDB 不会记录 $lookup 阶段外侧的计数器。

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

Pattern names describe plans at a coarse level. They omit limit and skip stages, and they don't distinguish whether a stage applies a filter or which type of projection a plan uses. To determine those details, combine a pattern counter with the nodes counters and the query shape for the entry.

patterns 可以包含以下计数器:

访问路径
计数器

集合扫描(collection scan)

  • 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

Fetch 阶段,根据该阶段是否应用过滤器单独计数。

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

Limit 阶段,按 limit 值分别计算。limitSmall 计算 100 或更小的限制,limitMedium 计算从 101 到 10 的限制,000,以及 limitLarge 计算大于 10 的限制,000。

skipSmall
skipMedium
skipLarge

跳过阶段,按 skip 值单独计算。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版本新增。

下表描述了 update 命令的查询结构属性。$queryStats 追踪 updates 数组中每个更新声明的查询结构统计信息,而不是整个顶级 update 命令的统计信息。

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

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版本新增。

下表描述了 delete 命令的查询结构属性。$queryStats 追踪 deletes 数组中每个删除声明的查询结构统计信息,而不是整个顶级 delete 命令的统计信息。

key.queryShape.limit 反映了 删除 声明的 limit 字段,其中 0 删除所有匹配的文档,1 删除单个文档。它不会限制查询统计条目的数量。

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

key.queryShape.q

文档

标准化

key.queryShape.limit

整型

$literal

key.queryShape.let

文档

标准化

key.queryShape.collation

文档

$literal

重要

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

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

If your query shape contains $vectorSearch, $queryStats outputs the following supplemental metrics:

字段
类型
说明

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

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