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提供此操作。


登录后回复
 

与 萌阔论坛 的连接断开,我们正在尝试重连,请耐心等待