Docs 菜单
Docs 主页
/
MongoDB Manual
/ /

绕过模式验证

在此页面上

  • 上下文
  • 支持的操作
  • 先决条件
  • 步骤
  • 结果
  • 了解详情

在某些情况下,您可能需要绕过集合的模式验证规则。例如,如果您要将可能无效的数据从备份恢复到具有验证规则的集合。在这种情况下,旧文档可能无法满足新的验证要求。

绕过模式验证是按操作进行的。如果绕过模式验证插入无效文档,今后对该无效文档的任何更新都必须满足以下任一条件:

  • 同时绕过模式验证

  • 生成有效文档

您可以使用以下命令和方法绕过基于每个操作的验证:

对于启用了访问控制的部署,要绕过文档验证,经过身份验证的用户必须有 bypassDocumentValidation 动作。内置角色 dbAdminrestore 可执行此动作。

以下示例创建了具有模式验证功能的集合,然后绕过验证规则插入了无效文档。

1

创建 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"
}
}
}
}
} )
2

以下文档无效,因为 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' }
}
]

后退

处理无效文档