MongoDB 模式验证
1. 模式验证简介
MongoDB 默认是“无模式”的,这意味着你可以在同一个集合中存储具有不同结构的文档。然而,在生产环境中,你可能希望强制执行特定的数据结构以确保数据质量。这就是模式验证发挥作用的地方。
通过模式验证,你可以定义文档必须具备的字段、数据类型以及取值范围。
2. 创建带有验证规则的集合
你可以在使用 createCollection() 命令创建新集合时,通过 validator 参数来指定验证规则。
示例:
下面的代码创建了一个名为 posts 的集合,并要求每个文档必须包含 title 和 body 字段,且它们必须是字符串类型。
db.createCollection("posts", {
validator: {
$jsonSchema: {
bsonType: "object",
required: [ "title", "body" ],
properties: {
title: {
bsonType: "string",
description: "必须为字符串且是必填项"
},
body: {
bsonType: "string",
description: "必须为字符串且是必填项"
}
}
}
}
})3. 修改现有集合的验证规则
如果你想为已经存在的集合添加或更改验证规则,可以使用 collMod 命令。
示例:
我们将为现有的 posts 集合增加一个必填的 category 字段:
db.runCommand({
collMod: "posts",
validator: {
$jsonSchema: {
bsonType: "object",
required: [ "title", "body", "category" ],
properties: {
title: {
bsonType: "string",
description: "必须为字符串且是必填项"
},
body: {
bsonType: "string",
description: "必须为字符串且是必填项"
},
category: {
bsonType: "string",
description: "必须为字符串且是必填项"
}
}
}
}
})4. 验证级别与验证操作
MongoDB 提供了两个配置项来控制验证规则的执行强度:validationLevel 和 validationAction。
4.1 validationLevel
该设置决定了 MongoDB 将验证规则应用于文档的严格程度:
- strict(默认值):MongoDB 将验证规则应用于所有的插入和更新操作。
- moderate:验证规则仅应用于已经符合验证规则的现有文档。对于不符合规则的现有文档,更新操作不会触发验证检查。
4.2 validationAction
该设置决定了当文档违反验证规则时 MongoDB 的反应:
- error(默认值):如果文档未通过验证,MongoDB 将拒绝该插入或更新操作,并抛出错误。
- warn:MongoDB 允许不符合规则的插入或更新,但会在系统日志中记录一条警告。
示例:
在创建集合时指定这些级别:
db.createCollection("contacts", {
validator: { $jsonSchema: { /* 你的规则 */ } },
validationLevel: "moderate",
validationAction: "warn"
})通过灵活运用这些工具,你可以在享受 NoSQL 动态特性的同时,构建出鲁棒性极强的数据层。