指定 JSON 架构验证
JSON Schema 是一个词汇表,允许您注释和验证 JSON 文档。您可以使用 JSON 模式以人类可读的格式为您的字段指定验证规则。
语境
MongoDB 支持 JSON Schema 草案 4,包括核心规范和验证规范, 有一些差异。有关详细信息,请参阅扩展和 遗漏。
有关 JSON 模式的更多信息,请参阅官网。
限制
您不能为以下内容指定架构验证:
admin
、local
和config
数据库中的集合- 系统收藏
步骤
在此示例中,您创建了一个students
包含验证规则的集合,并在您尝试插入无效文档后观察结果。
创建一个带有验证的集合。
创建一个
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" } } } } } )
[TIP]
用标题和描述字段阐明规则
当规则不是很清楚时,您可以使用
title
和字段来提供验证规则的解释。description
当文档验证失败时,MongoDB 会在错误输出中包含这些字段。确认验证可防止无效文档。
以下插入操作失败,因为
gpa
在validator
需要double
.db.students.insertOne( { name: "Alice", year: Int32( 2019 ), major: "History", gpa: Int32(3), address: { city: "NYC", street: "33rd Street" } } )
该操作返回此错误:
MongoServerError: Document failed validation Additional information: { failingDocumentId: ObjectId("630d093a931191850b40d0a9"), details: { operatorName: '$jsonSchema', title: 'Student Object Validation', schemaRulesNotSatisfied: [ { operatorName: 'properties', propertiesNotSatisfied: [ { propertyName: 'gpa', description: "'gpa' must be a double if the field exists", details: [ { operatorName: 'bsonType', specifiedAs: { bsonType: [ 'double' ] }, reason: 'type did not match', consideredValue: 3, consideredType: 'int' } ] } ] } ] } }
插入有效文档。
将
gpa
字段更改为双精度后插入成功:db.students.insertOne( { name: "Alice", year: NumberInt(2019), major: "History", gpa: Double(3.0), address: { city: "NYC", street: "33rd Street" } } )
查询有效文件。
要确认文档已成功插入,请查询
students
集合:db.students.find()
MongoDB 返回插入的文档:
[ { _id: ObjectId("62bb413014b92d148400f7a5"), name: 'Alice', year: 2019, major: 'History', gpa: 3, address: { city: 'NYC', street: '33rd Street' } } ]
附加信息
您可以将 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
。
学到更多
参见
原文:Specify JSON Schema Validation
译者:景圣