在 MongoDB 中指定 JSON Schema 验证规则

JSON Schema 是一套用于注释和验证 JSON 文档的词汇体系。可以用它以便于阅读的格式,为字段指定验证规则。

MongoDB 支持 JSON Schema 第 4 版草案,包括核心规范和验证规范,但存在一些差异,详见“扩展与省略”。

关于 JSON Schema 的更多信息,可访问其官方网站。

不能为以下集合指定模式验证:

  • admin、local 和 config 数据库中的集合。

  • 系统集合。

如果集合启用了客户端字段级加密或可查询加密,验证还受到以下限制:

  • 对于客户端字段级加密(CSFLE),运行 collMod 时,libmongocrypt 库优先使用命令中指定的 JSON 加密模式。通过这种优先规则,可以为尚未具有模式的集合设置模式。

  • 对于可查询加密,任何包含加密字段的 JSON Schema 都会引发查询分析错误。

本例创建带有验证规则的 students 集合,并观察尝试插入无效文档后的结果。

1

若要通过 mongosh 连接本地 MongoDB 实例或 MongoDB Atlas 部署,请参考“连接部署”或“通过 mongosh 连接”。

2

在 mongosh 中运行以下命令,创建 students 集合,并通过 $jsonSchema 操作符设置模式验证规则:

db.createCollection("students", {
   validator: {
      $jsonSchema: {
         bsonType: "object",
         title: "Student Object Validation",
         required: [ "address", "major", "name", "year" ],
         properties: {
            name: {
               bsonType: "string",
               description: "'name' must be a string and is required"
            },
            year: {
               bsonType: "int",
               minimum: 2017,
               maximum: 3017,
               description: "'year' must be an integer in [ 2017, 3017 ] and is required"
            },
            gpa: {
               bsonType: [ "double" ],
               description: "'gpa' must be a double if the field exists"
            }
         }
      }
   }
} )

提示

使用 title 和 description 说明规则

对于含义不够直观的验证规则,可以使用 title 和 description 字段解释。文档验证失败时,MongoDB 会将这些字段包含在错误输出中。

3

将 gpa 字段值改成 double 类型后,插入操作即可成功。运行以下命令插入有效文档:

db.students.insertOne( {
   name: "Alice",
   year: Int32( 2019 ),
   major: "History",
   gpa: Double( 3.0 ),
   address: {
      city: "NYC",
      street: "33rd Street"
   }
} )

说明

如果尝试插入无效文档,MongoDB 会返回错误。

4

若要确认文档已成功插入,运行以下命令查询 students 集合:

db.students.find()
[
  {
    _id: ...,
    name: 'Alice',
    year: 2019,
    major: 'History',
    gpa: 3,
    address: {
      city: 'NYC',
      street: '33rd Street'
    }
  }
]

提示

如果连接的是 Atlas 部署,也可以在 Atlas 界面中查看和筛选该文档。

可以将 JSON Schema 验证与查询操作符验证组合使用。

例如,假设 sales 集合配置了以下模式验证:

 db.createCollection("sales", {
   validator: {
     "$and": [
       // Validation with query operators
       {
         "$expr": {
           "$lt": ["$lineItems.discountedPrice", "$lineItems.price"]
         }
       },
       // Validation with JSON Schema
       {
         "$jsonSchema": {
           "properties": {
             "items": { "bsonType": "array" }
           }
          }
        }
      ]
    }
  }
)

上述验证会对 sales 集合中的文档实施以下规则:

  • lineItems.discountedPrice 必须小于 lineItems.price。这条规则使用 $lt 操作符。

  • items 字段必须是数组。这条规则使用 $jsonSchema。

  • 完整的 JSON Schema 关键字清单见“可用关键字”。

  • 要限制某个字段允许的值,见“指定允许的字段值”。

  • 避免 JSON Schema 验证常见问题的方法,见“JSON Schema 验证提示”。


原文:Specify JSON Schema Validation。作者/来源:MongoDB 文档团队。本文依据所列原文整理为中文,代码、命令与配置示例保留原文。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容