JSON schema 是一个词汇表,可让您注释和验证JSON文档。使用JSON schema 以人类可读的格式指定字段的验证规则。
上下文
MongoDB支持JSON schema 的 4 草案,包括 核心规范 和 验证规范,但存在一些差异。有关详细信息,请参阅 扩展 和 省略。
有关 JSON schema 的更多信息,请参阅官方网站。
限制
不能为以下对象指定模式验证:
admin、local和config数据库中的集合
如果在集合上启用了客户端字段级加密或可查询加密,则验证会受到以下限制:
对于 CSFLE,运行
collMod时,libmongocrypt 库首选命令中指定的 JSON 加密模式。此首选项支持在尚无模式的集合上设置模式。对于 Queryable Encryption,任何包含加密字段的 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 字段解释无法立即明确的验证规则。当文档验证失败时, MongoDB会在错误输出中包含这些字段。
查询有效文档。
要确认已成功插入文档,请运行以下命令来查询 students 集合:
db.students.find()
[ { _id: ..., name: 'Alice', year: 2019, major: 'History', gpa: 3, address: { city: 'NYC', street: '33rd Street' } } ]
提示
如果连接到 Atlas 部署,还可以在 Atlas 用户界面中查看和过滤文档。
更多信息
您可以将 JSON 模式验证与查询运算符验证结合使用。
例如,考虑具有以下模式验证的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 模式验证方面的问题,请参阅 JSON 模式验证提示。