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

validate(数据库命令)

在版本6.2中进行了更改。

validate

validate 命令检查集合的数据和索引的正确性并返回结果。

提示

在mongosh 中,该命令也可以通过validate() 辅助方法运行。

辅助方法对 mongosh 用户来说很方便,但它们返回的信息级别可能与数据库命令不同。如果不需要方便性或需要额外的返回字段,请使用数据库命令。

在版本5.0中进行了更改。

从版本5.0 开始,validate 命令还可以查找集合中的不一致之处,并在可能的情况下进行修复。

索引不一致包括:

  • 索引是多键的,但没有多键字段。

  • 索引具有多键路径,涵盖非多键字段。

  • 索引没有多键路径,但有多键文档(适用于 3.4 之前构建的索引)。

如果 db.collection.validate() 命令检测到任何不一致,将返回警告,然后将索引上的修复标志设置为 true。

db.collection.validate() 还会验证任何违反集合模式验证规则的文档。

注意

validate命令不支持视图,在针对视图运行时会引发错误。

db.collection.validate()中的 方法提供了mongosh validate的包装器。

此命令可用于以下环境中托管的部署:

  • MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务

重要

M0 和 Flex 集群不支持此命令。有关更多信息,请参阅不支持的命令。

该命令具有以下语法:

db.runCommand(
{
validate: <string>, // Collection name
full: <boolean>, // Optional
repair: <boolean>, // Optional, added in MongoDB 5.0
metadata: <boolean>, // Optional, added in MongoDB 5.0.4
checkBSONConformance: <boolean> // Optional, added in MongoDB 6.2
}
)

该命令接受以下字段:

字段
类型
说明

validate

字符串

要验证的集合名称。

布尔

可选。一个标志,确定该命令执行较慢但更彻底的检查还是执行更快但不太彻底的检查。

  • 如果为 true,则执行更彻底的检查,但有以下例外:

    • oplog对WiredTiger的 进行全面验证会跳过更彻底的检查。validate.warnings 包括行为通知。
  • 如果为 false,则省略某些检查,以进行更快但不太彻底的检查。

默认为 false。

对于WiredTiger存储引擎,只有full验证进程会在验证磁盘数据之前强制设置检查点并将所有内存中数据刷新到磁盘。

布尔

可选。确定命令是否执行修复的标志。

  • 如果为 true,则执行修复。

  • 如果为 false,则不执行修复。

默认为 false。

修复只能在独立节点上运行。

此修复修复以下问题:

  • 如果找到缺失的索引条目,则将缺失的键插入索引中。

  • 如果找到额外的索引条目,则从索引中删除额外的键。

  • 如果为非多键索引的索引找到多键文档,则该索引会更改为多键索引。

  • 如果发现未由索引的多键路径指定的多键文档,则会更新该索引的多键路径。

  • 如果发现包含无效 BSON 数据的损坏文档,则会删除这些文档。

有关详细信息,请参阅 的--repair 选项mongod

版本 5.0 中的新增功能。

布尔

可选。允许用户执行快速验证以检测无效索引选项的标志,而无需扫描所有文档和索引。

  • 如果为 true,则执行元数据验证扫描。

  • 如果 false,则不执行元数据验证扫描。

默认为 false。

{ metadata: true }不支持将使用 的验证命令与任何其他validate 选项一起运行。

metadata 验证选项:

  • 通过仅扫描集合元数据,为您提供更快识别无效索引的方法。

  • 与 collMod 命令一起使用时,提供关于删除和重新创建多个无效索引的替代方法。

metadata 验证选项仅扫描集合元数据以更快地找到无效索引。

如果检测到无效索引,validate 命令将提示您使用 collMod 命令删除无效索引。

db.runCommand( { collMod: <collectionName> } )

5.0.4版本新增。

布尔

可选。如果为 true,则对集合进行检查,确保 BSON 文档符合 BSON 规范。这些检查会增加完成验证操作的时间。任何问题都会作为警告返回。

checkBSONConformance:

  • 默认值为 false。

  • 当 full 设置为 true 时启用。

  • 在以下情况下无法使用:

    • repair 设置为 true。

    • metadata 设置为 true。

6.2版本新增。

validate命令可能会很慢,尤其是在较大的数据集上。

validate命令获取集合上的独占锁W 。这将区块对集合的所有读取和写入,直到操作完成。在从节点(secondary node from replica set)上运行时,validate 操作可以区块该从节点(secondary node from replica set)上的所有其他操作,直到完成为止。

警告

由于验证会影响性能,请考虑仅在从节点(secondary nodevalidate from replica set)副本集上运行 。您可以使用rs.stepDown() 指示当前主节点(primary node in the replica set)节点成为从节点(secondary node from replica set),以避免影响活动的主节点 (primary node in the replica set)节点。

$currentOp 和 currentOp 命令包含用于正在进行的验证操作的 dataThroughputAverage 和 dataThroughputLastSecond 信息。

验证操作的日志消息包括 dataThroughputAverage 和 dataThroughputLastSecond 信息。

从MongoDB6.2 开始,validate 命令和db.collection.validate() 方法:

  • 检查集合,确保 BSON 文档符合 BSON 规范。

  • 检查时间序列集合的内部数据是否不一致。

  • 有一个支持全面的 BSON 检查的新选项 checkBSONConformance。

validate命令不再支持 afterClusterTime。因此, validate不能与因果一致的会话关联。

时间序列集合是在MongoDB 5.0 中引入的。从 v5.2 开始,存储时间序列测量值的默认内部格式已更改。由于此更改:

  • 在 v5.2 之前创建的时间序列集合可能同时包含旧格式和新格式的文档。在内部,此类集合被标记为 timeseriesBucketsMayHaveMixedSchemaData: true。

  • 在 v5.2 或更高版本中创建的时间序列集合将始终包含新格式的文档。在内部,此类集合被标记为 timeseriesBucketsMayHaveMixedSchemaData: false 或根本不标记。

当标志为 true 时,时间序列查询会同时考虑新格式和旧格式。当标志为 false 或缺失时,时间序列查询仅考虑新格式。

由于 SERVER-91194 中描述的错误,在某些情况下该标志可能会丢失。在5 v.2 之前创建的时间序列集合出现这种情况时,读取查询结果可能不完整。也就是说,某些文档可能会丢失,尽管它们仍然存储在磁盘上。

要确定您是否受到此影响,请在您的时间序列集合上运行 validate。如果集合受到此错误的影响,则该命令会返回错误。如果出现这种情况,您的读取查询结果可能不正确。

如果受影响,升级到已修复的版本,并为每个受影响的集合将 timeseriesBucketsMayHaveMixedSchemaData设立为 true,以确保将来对该集合的查询返回正确的结果。此进程的完整步骤位于此处。

从 MongoDB 6.0 开始,如果唯一索引的密钥格式不兼容,validate 命令将返回一条消息。该消息会说明使用了旧格式。

  • 要使用默认验证设置(特别是 full: false)验证集合 myCollection:

    db.runCommand( { validate: "myCollection" } )
  • 要对集合 myCollection 执行全面验证,请指定 full: true:

    db.runCommand( { validate: "myCollection", full: true } )
  • 要修复集合 myCollection,请指定 repair: true:

    db.runCommand( { validate: "myCollection", repair: true } )
  • 要验证 myCollection 集合中的元数据,请指定 metadata: true:

    db.runCommand( { validate: "myCollection", metadata: true } )
  • 要在 myCollection 中执行额外的 BSON 一致性检查,请指定 checkBSONConformance: true:

    db.runCommand( { validate: "myCollection", checkBSONConformance: true } )

注意

根据 MongoDB 实例的具体配置,输出可能有所不同。

指定 full:true 以获得更详细的输出。

validate.uuid

集合的通用唯一标识符 (UUID)。

6.2版本新增。

validate.nInvalidDocuments

集合中无效文档的数量。无效文档是指无法读取的文档,这意味着BSON文档已损坏,存在错误或大小不匹配。

validate.nNonCompliantDocuments

不符合集合模式的文档数量。不合规的文档在nInvalidDocuments 中不计为无效。

从 MongoDB 6.2 开始,nNonCompliantDocuments 还包括不符合 BSON 或时间序列集合要求的文档数量。

validate.nrecords

集合中文档数量。

validate.nIndexes

集合上已验证的索引数量。

validate.keysPerIndex

一个文档,包含了集合中每个索引的名称和索引条目数。

"keysPerIndex" : {
"_id_" : <num>,
"<index2_name>" : <num>,
...
}

keysPerIndex 仅通过名称标识索引。

validate.indexDetails

一个文档,包含每个索引的索引验证状态。

"indexDetails" : {
"_id_" : {
"valid" : <boolean>
},
"<index2_name>" : {
"valid" : <boolean>
},
...
}
  • indexDetails 标识无效的一个或多个特定索引。如果任何索引无效,MongoDB 的早期版本会将所有索引标记为无效。

  • indexDetails仅通过名称索引索引。早期版本的MongoDB显示索引的完整命名空间;即<db>.<collection>.$<index_name> 。

validate.ns

集合的完整命名空间名称。命名空间包括格式为 database.collection 的数据库名称和集合名称。

validate.valid

true如果validate 确定集合的所有方面都有效,则为 的布尔值。当false 时,请参阅errors 字段以了解更多信息。

validate.repaired

true如果validate 修复了集合,则为 的布尔值。

validate.warnings

一个数组,包含有关验证操作本身的警告消息(如有)。警告消息并不表示集合本身无效。例如:

"warnings" : [
"Could not complete validation of table:collection-28-6471619540207520785. This is a transient issue as the collection was actively in use by other operations."
],
validate.errors

如果集合无效(即valid 为假),则该字段将包含一条描述验证错误的消息。

validate.extraIndexEntries

一个数组,包含指向集合中不存在的文档的每个索引条目的信息。

"extraIndexEntries" : [
{
"indexName" : <string>,
"recordId" : <NumberLong>, // for the non-existent document
"indexKey" : {
"<key1>" : <value>,
...
}
}
...
]

注意

对于extraIndexEntries 大量,所有indexKey 字段大小的总和限制为1 MB,其中大小包括indexKey 的键和值。如果总和超过此大小,则警告字段会显示一条消息。

validate.missingIndexEntries

一个数组,包含缺少相应索引条目的每个文档的信息。

"missingIndexEntries" : [
{
"indexName" : <string>,
"recordId" : <NumberLong>,
"idKey" : <_id key value>, // The _id value of the document. Only present if an ``_id`` index exists.
"indexKey" : { // The missing index entry
"<key1>" : <value>,
...
}
}
...
]

注意

对于missingIndexEntries 大量,idKey 字段大小及其所有indexKey 字段大小的总和限制为1 MB,其中字段大小包括idKey 和indexKey 。如果总和超过此大小,则警告字段会显示一条消息。

validate.corruptRecords

一个由 RecordId 值组成的数组,表示无法读取的文档,可能是因为数据已损坏。这些文档在验证期间被报告为已损坏。RecordId 是一个 64 位整数内部密钥,用于唯一标识集合中的文档。

"corruptRecords" : [
Long(1), // RecordId 1
Long(2) // RecordId 2
]

版本 5.0 中的新增功能。

validate.ok

1命令成功时值为ok 的整数。如果命令失败,则 字段的值为0 。