Data Model(数据模型)——文档验证
-
3.2版新特性
MongoDB提供在更新和插入期间验证文档的能力。 验证规则是使用validator选项基于每个集合指定的,它接受指定验证规则或表达式的文档。 使用任何查询运算符指定表达式,除了$near,$nearSphere,$text和 $where。
使用带有验证器选项的collMod命令将文档验证添加到现有集合。 您也可以在使用带有validator选项的db.createCollection()创建新集合时指定文档验证规则,如下所示:db.createCollection( "contacts", { validator: { $or: [ { phone: { $type: "string" } }, { email: { $regex: /@mongodb\.com$/ } }, { status: { $in: [ "Unknown", "Incomplete" ] } } ] } } )
MongoDB还提供了validationLevel选项,该选项确定MongoDB在更新期间对现有文档应用验证规则的严格程度,以及validationAction选项,用于确定MongoDB是否抛出错误并拒绝违反验证规则的文档,或者在日志中对违规行为警告,但接受无效文档。
行为
验证在更新和插入期间发生。 向集合添加验证时,现有文档在修改之前不进行验证检查。现有文档
您可以使用validationLevel选项控制MongoDB如何处理现有文档。
默认情况下,validationLevel是strict,MongoDB将验证规则应用于所有插入和更新。 设置validationLevel 为 moderate将验证满足验证条件的现有文档的插入和更新操作。 使用moderate,不会检查不满足验证条件的现有文档的更新是否有效。
例如:
假设联系人集合中有如下文档{ "_id": "125876", "name": "Anne", "phone": "+1 555 123 456", "city": "London", "status": "Complete" }, { "_id": "860000", "name": "Ivan", "city": "Vancouver" }
执行以下命令以向联系人集合添加验证
db.runCommand( { collMod: "contacts", validator: { $or: [ { phone: { $exists: true } }, { email: { $exists: true } } ] }, validationLevel: "moderate" } )
联系人集合现在具有包含moderate级别的验证器。 如果您尝试对_id为125876文档更新,则MongoDB将应用验证规则,因为现有文档与条件匹配。 相比之下,MongoDB不会验证_id为860000的文档的更新,因为它不符合验证规则。
要完全禁用验证,您可以将validationLevel设置为off。接受或拒绝无效的文档
validationAction选项确定MongoDB如何处理违反验证规则的文档。
默认情况下,validationAction是抛出错误,MongoDB拒绝任何违反验证标准的插入或更新。 当validationAction设置为warn时,MongoDB日志记录所有违反验证规则的情况,但允许插入或更新继续进行。
例如:
以下示例创建具有验证器的联系人集合,该验证器指定插入或更新的文档应至少符合以下三个条件之一:
1. phone字段是一个字符串;
2. email字段匹配正则表达式;
3. status字段为Unknown 或者 Incomplete。db.createCollection( "contacts", { validator: { $or: [ { phone: { $type: "string" } }, { email: { $regex: /@mongodb\.com$/ } }, { status: { $in: [ "Unknown", "Incomplete" ] } } ] }, validationAction: "warn" } )
因为存在上述验证器,以下插入操作将不能通过验证,但由于validationAction设置为warn,日志记录验证失败,写操作仍然成功。
日志包括集合的完整命名空间以及验证失败的文档,以及操作时间:
2015-10-15T11:20:44.260-0400 W STORAGE [conn3] Document would fail validation collection: example.contacts doc: { _id: ObjectId('561fc44c067a5d85b96274e4'), name: "Amanda", status: "Updated" }限制
不能在admin,local和config数据库中指定集合的验证器。
不能为system.*集合指定验证器。忽略文档验证
用户可以使用bypassDocumentValidation选项绕过文档验证。 有关支持绕过文档验证选项的命令的列表,请参阅文档验证。
对于已启用访问控制的部署,要绕过文档验证,已验证用户必须具有bypassDocumentValidation操作。 内置角色dbAdmin和restore提供此操作。