MongoDB 简明教程

MongoDB 模式验证

1. 模式验证简介

MongoDB 默认是“无模式”的,这意味着你可以在同一个集合中存储具有不同结构的文档。然而,在生产环境中,你可能希望强制执行特定的数据结构以确保数据质量。这就是模式验证发挥作用的地方。

通过模式验证,你可以定义文档必须具备的字段、数据类型以及取值范围。

2. 创建带有验证规则的集合

你可以在使用 createCollection() 命令创建新集合时,通过 validator 参数来指定验证规则。

示例:

下面的代码创建了一个名为 posts 的集合,并要求每个文档必须包含 titlebody 字段,且它们必须是字符串类型。

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 提供了两个配置项来控制验证规则的执行强度:validationLevelvalidationAction

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 动态特性的同时,构建出鲁棒性极强的数据层。