JSON Schema 是一套用于注释和验证 JSON 文档的词汇体系。可以用它以便于阅读的格式,为字段指定验证规则。
背景
MongoDB 支持 JSON Schema 第 4 版草案,包括核心规范和验证规范,但存在一些差异,详见“扩展与省略”。
关于 JSON Schema 的更多信息,可访问其官方网站。
限制
不能为以下集合指定模式验证:
admin、local 和 config 数据库中的集合。
系统集合。
如果集合启用了客户端字段级加密或可查询加密,验证还受到以下限制:
对于客户端字段级加密(CSFLE),运行 collMod 时,libmongocrypt 库优先使用命令中指定的 JSON 加密模式。通过这种优先规则,可以为尚未具有模式的集合设置模式。
对于可查询加密,任何包含加密字段的 JSON Schema 都会引发查询分析错误。
步骤
本例创建带有验证规则的 students 集合,并观察尝试插入无效文档后的结果。
连接 MongoDB 部署
若要通过 mongosh 连接本地 MongoDB 实例或 MongoDB Atlas 部署,请参考“连接部署”或“通过 mongosh 连接”。
创建启用验证的集合
在 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 会将这些字段包含在错误输出中。
插入有效文档
将 gpa 字段值改成 double 类型后,插入操作即可成功。运行以下命令插入有效文档:
db.students.insertOne( {
name: "Alice",
year: Int32( 2019 ),
major: "History",
gpa: Double( 3.0 ),
address: {
city: "NYC",
street: "33rd Street"
}
} )
说明
如果尝试插入无效文档,MongoDB 会返回错误。
查询有效文档
若要确认文档已成功插入,运行以下命令查询 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 文档团队。本文依据所列原文整理为中文,代码、命令与配置示例保留原文。











暂无评论内容