对于 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
background: <boolean> // Optional
}
)

该命令接受以下字段:

字段
类型
说明

validate

字符串

要验证的集合名称。

full

布尔

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

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

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

默认为 false

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

repair

布尔

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

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

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

默认为 false

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

此修复修复了以下问题:

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

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

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

重要提示:要将 repair设立为 true,必须将 fixMultikey 选项设立为 true

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

版本 5.0 中的新增功能。

metadata

布尔

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

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

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

默认为 false

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

metadata 验证选项:

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

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

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

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

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

5.0.4版本新增。

checkBSONConformance

布尔

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

checkBSONConformance:

  • 默认值为 false

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

    • repair 设置为 true

    • metadata 设置为 true

6.2版本新增。

fixMultikey

布尔

可选。如果为 true,MongoDB修复以下问题:

  • 如果 validate 命令找到非多键索引的多键文档, MongoDB会将索引更改为多键索引。

  • 如果validate 命令找到索引的多键路径未指定的多键文档, MongoDB将更新索引的多键路径。

默认为 false

8.1版本新增。

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)节点。

$currentOpcurrentOp 命令包含用于正在进行的验证操作的 dataThroughputAveragedataThroughputLastSecond 信息。

验证操作的日志消息包括 dataThroughputAveragedataThroughputLastSecond 信息。

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

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

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

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

从MongoDB 8.3 开始,validate 命令和 db.collection.validate() 方法会检查集合,以确保集合没有任何超过 16 MB 的document。

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 命令将返回一条消息。该消息会说明使用了旧格式。

validate命令将collStats 输出中集合的计数和数据大小统计信息更新为正确的值。

注意

如果发生非正常关闭,计数和数据大小统计信息可能不准确。

  • 要使用默认验证设置(特别是 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

在版本8.1中进行了更改。

包含每个索引的索引验证状态和索引规范的文档。

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

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

  • spec文档是索引规范,它因索引的定义方式而异。一些示例spec文档字段包括:

    • spec.v。索引版本。

    • spec.unique。一个布尔值,表示索引是否唯一。

    • spec.key。索引键标识符。

    • spec.name。索引名称。

    8.1版本新增。

validate.ns

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

validate.valid

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

validate.repaired

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

validate.repairMode

8.2版本新增。

一个字符串,表示 validate 命令尝试修复的数据不一致类型(如果检测到)。 可能的 repairMode 值包括:

  • None:不执行任何修复操作。

  • FixErrors:尝试修复任何验证错误。

  • AdjustMultikey:尝试通过调整多键元元数据来修复多键不一致问题。

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,其中字段大小包括idKeyindexKey 。如果总和超过此大小,则警告字段会显示一条消息。

validate.corruptRecords

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

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

版本 5.0 中的新增功能。

validate.ok

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

validate.fastCountType

用于报告集合大小和数量的元数据集合类型的字符串。可能的 fastCountType 值包括:

  • legacySizeStorer

  • replicated

  • both

  • neither