绕过架构验证
在某些情况下,您可能需要绕过集合的架构验证规则。例如,如果您要将可能无效的数据从备份恢复到具有验证规则的集合。在这种情况下,旧文档可能无法满足新的验证要求。
语境
绕过模式验证是在每个操作的基础上完成的。如果您绕过架构验证以插入无效文档,则以后对无效文档的任何更新都必须:
- 也绕过架构验证
- 结果是一个有效的文件
支持的操作
您可以使用以下命令和方法绕过每个操作的验证:
- applyOps命令
- findAndModify命令和- db.collection.findAndModify()方法
- mapReduce命令和- db.collection.mapReduce()方法
- insert命令
- update命令
- $out命令和 方法的- $merge阶段- aggregate- db.collection.aggregate()
先决条件
对于已启用访问控制的部署,要绕过文档验证,经过身份验证的用户必须有 bypassDocumentValidation操作。内置角色 dbAdmin并restore提供此操作。
步骤
下面的示例创建一个具有模式验证的集合,然后通过绕过验证规则插入一个无效文档。
- 创建具有验证规则的集合 - 创建一个 - students集合并使用- $jsonSchema运算符设置模式验证规则:- db.createCollection("students", { validator: { $jsonSchema: { bsonType: "object", required: [ "name", "year", "major", "address" ], properties: { name: { bsonType: "string", description: "must be a string and is required" }, year: { bsonType: "int", minimum: 2017, maximum: 3017, description: "must be an integer in [ 2017, 3017 ] and is required" } } } } } )
- 绕过验证以插入无效文档 - 以下文档无效,因为该 - year字段超出了允许的范围 (- 2017-- 3017):- { name: "Alice", year: Int32( 2016 ), major: "History", gpa: Double(3.0), address: { city: "NYC", street: "33rd Street" } }- 要绕过验证规则并插入无效文档,请运行以下 - insert命令,将- bypassDocumentValidation选项设置为- true:- db.runCommand( { insert: "students", documents: [ { name: "Alice", year: Int32( 2016 ), major: "History", gpa: Double(3.0), address: { city: "NYC", street: "33rd Street" } } ], bypassDocumentValidation: true } )
结果
要确认文档已成功插入,请查询 students集合:
db.students.find()
MongoDB 返回插入的文档:
[
   {
      _id: ObjectId("62bcb4db3f7991ea4fc6830e"),
      name: 'Alice',
      year: 2016,
      major: 'History',
      gpa: 3,
      address: { city: 'NYC', street: '33rd Street' }
   }
]
学到更多
参见
译者:景圣