对于在添加验证之前集合中已存在的文档,您可以指定 MongoDB 如何将验证规则应用于这些文档。
上下文
您的模式的 validationLevel 决定了 MongoDB 应用验证规则的文档:
validationLevel | 行为 |
|---|---|
| MongoDB将相同的验证规则应用于文档插入,并更新与验证规则匹配的现有有效文档。 对集合中现有文档的更新如果与验证规则不匹配,则无需通过验证。 |
| (默认) MongoDB对所有文档插入和更新应用相同的验证规则。 |
| MongoDB 将验证规则应用于所有文档插入和更新,并 ACID 一致性保证集合中的每个文档都满足这些规则。与
9.0版本新增。 |
先决条件
此页面上的示例使用的是 movies 集合。要创建集合并插入示例所使用的文档,请运行以下命令:
db.movies.insertMany( [ { title: "The Godfather", year: 1972 }, { title: "Casablanca", year: 1942 } ] )
设置适度验证
以下示例将 moderate 验证器添加到 movies 集合中,并插入一个满足验证规则的文档。
指定具有 moderate 验证级别的验证规则。
使用 moderate validationLevel 向 movies 集合添加一个验证器:
db.runCommand( { collMod: "movies", validator: { $jsonSchema: { bsonType: "object", required: [ "title" ], properties: { title: { bsonType: "string", description: "title must be a string and is required" } } } }, validationLevel: "moderate" } )
因为 validationLevel 是 moderate,MongoDB 将验证规则应用于所有文档插入和对已满足规则的现有文档的更新。
指定严格的验证
以下示例将 strict 验证器添加到 movies 集合中,并插入一个满足验证规则的文档。
指定具有 strict 验证级别的验证规则。
使用 strict validationLevel 向 movies 集合添加一个验证器:
db.runCommand( { collMod: "movies", validator: { $jsonSchema: { bsonType: "object", required: [ "title" ], properties: { title: { bsonType: "string", description: "title must be a string and is required" } } } }, validationLevel: "strict" } )
由于 validationLevel 为 strict,MongoDB 将验证规则应用于所有文档插入和更新。
注意
当您升级到 strict 验证时,MongoDB 不会追溯检查集合中的现有文档是否通过验证器。升级后,集合可能包含升级前就已存在的无效文档。然而,对不合法文档的更新操作会失败,因为验证器的原因。要更新无效文档,首先解决导致验证器失败的问题。
指定约束验证
以下示例将 movies 集合升级到 constraint 验证级别。当您升级到 constraint 级别时,MongoDB 会检查集合中已有的每个文档是否满足验证程序。
注意
以下过程适用于已存在的集合。如果您在创建集合时将 validationLevel 设置为 constraint,则无需先将级别设置为 strict 或准备集合。
(可选)将您的 validationLevel 设置为 strict。
If your collection's validationLevel is not already strict, follow the procedure to specify strict validation.
为 constraint 级别准备集合。
将 prepareConstraintValidationLevel 设置为 true 以运行 collMod:
db.runCommand( { collMod: "movies", prepareConstraintValidationLevel: true } )
此命令通过阻止 bypassDocumentValidation 并防止对验证程序进行更改,为升级做好集合准备。
将验证级别设置为 constraint。
运行 collMod 以将 validationLevel 设置为 constraint。validationAction 必须是 error 或 errorAndLog:
db.runCommand( { collMod: "movies", validationLevel: "constraint", validationAction: "error" } )
您无法在将 validationLevel 升级到 constraint 的同一 collMod 操作中更改 validator。在运行此命令之前,请设置验证规则。要在以后更改规则,将级别降级到 strict,修改规则,然后再升级回 constraint。
由于 validationLevel 为 constraint,MongoDB 会将验证规则应用于所有文档插入和更新,无论现有文档在升级前是否符合这些规则。
当您将级别设置为 constraint 时,MongoDB 会扫描集合中的所有现有文档,如果任何文档违反了验证程序,则会使 collMod 操作失败。对于大型集合,此扫描的计算成本可能很高。如果操作失败,请在继续之前更新违规文档以通过验证程序。
重要
错误输出供人类使用。它将来可能会更改,不应在脚本中依赖它。