定义
validatevalidate命令检查集合的数据和索引的正确性并返回结果。提示
在
mongosh中,该命令也运行通过validate()辅助方法运行。辅助方法对
mongosh用户来说很方便,但它们返回的信息级别可能与数据库命令不同。如果不追求方便或需要额外的返回字段,请使用数据库命令。5.0 版本中的更改。
从 5.0 版开始,
validate命令还可以查找集合中的不一致性,并尽可能加以修正。索引不一致包括:
如果
db.collection.validate()命令检测到任何不一致,将返回警告,然后将索引上的修复标志设置为true。db.collection.validate()还会验证任何违反集合模式验证规则的文档。mongosh中的db.collection.validate()方法会提供有关validate的封装器。
兼容性
此命令可用于以下环境中托管的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
重要
M0 和 Flex 集群不支持此命令。有关更多信息,请参阅不支持的命令。
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
5.0 版本中的更改。
该命令具有以下语法:
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 } )
命令字段
该命令接受以下字段:
字段 | 类型 | 说明 | |
|---|---|---|---|
| 字符串 | 要验证的集合名称。 | |
布尔 | 可选。一个标志,确定该命令执行较慢但更彻底的检查还是执行更快但不太彻底的检查。
默认为 对于WiredTiger存储引擎,只有 | ||
布尔 | |||
布尔 | 可选。允许用户执行快速验证以检测无效索引选项的标志,而无需扫描所有文档和索引。
默认为
如果检测到无效索引,validate 命令将提示您使用 5.0.4 版本中的新增功能。 |
行为
性能
validate 命令的运行速度较慢,尤其是在较大的数据集上。
validate 命令获得对集合的独占锁 W。此操作会阻塞对集合的所有读写操作,直到完成为止。在从节点上运行时,validate 操作可以阻塞该从节点上的所有其他操作,直到其完成为止。
警告
由于验证会影响性能,请考虑仅在从副本集节点上运行 validate。您可以使用 rs.stepDown() 指示当前主节点成为从节点,避免影响活动的主节点。
数据吞吐量指标
$currentOp 和 currentOp 命令包含用于正在进行的验证操作的 dataThroughputAverage 和 dataThroughputLastSecond 信息。
验证操作的日志消息包括 dataThroughputAverage 和 dataThroughputLastSecond 信息。
限制
validate 命令不再支持 afterClusterTime。因此,validate 不能与因果一致的会话相关联。
索引键格式
从 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 } )
验证输出
注意
根据 MongoDB 实例的具体配置,输出可能有所不同。
指定 full:true 以获得更详细的输出。
validate.nInvalidDocuments集合中无效文档的数量。无效文档是指无法读取的文档,这意味着BSON文档已损坏,存在错误或大小不匹配。
validate.nNonCompliantDocuments不符合该集合的模式的文档数量。不符合的文档在
nInvalidDocuments中不计为无效。
validate.nrecords集合中文档数量。
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.repaired如果
validate修复了该集合,则为true的布尔值。
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为 false),则此字段将包含一条描述验证错误的消息。
validate.extraIndexEntries一个数组,包含指向集合中不存在的文档的每个索引条目的信息。
"extraIndexEntries" : [ { "indexName" : <string>, "recordId" : <NumberLong>, // for the non-existent document "indexKey" : { "<key1>" : <value>, ... } } ... ] 注意
对于
extraIndexEntries数组,所有indexKey字段大小的总和限制为 1MB,其中这些字段大小包括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字段大小总和的上限为 1MB,其中字段大小包括idKey和indexKey的键和值。如果总和超过此大小,则警告字段将显示一条消息。
validate.corruptRecords一个由
RecordId值组成的数组,表示无法读取的文档,可能是因为数据已损坏。这些文档在验证期间被报告为已损坏。RecordId是一个 64 位整数内部密钥,用于唯一标识集合中的文档。"corruptRecords" : [ Long(1), // RecordId 1 Long(2) // RecordId 2 ] 版本 5.0 中的新增功能。
validate.ok命令成功时值为
1的整数。如果命令失败,ok字段的值为0。