- MongoDB官方文档中文版
- MongoDB中文手册说明
- MongoDB简介
- 安装 MongoDB
- The mongo Shell
- MongoDB CRUD 操作
- 聚合
- 数据模型
- 事务
- 索引
- 安全
- 安全检查列表
- 启用访问控制
- 身份验证
- 基于角色的访问控制
- TLS / SSL(传输加密)
- 静态加密
- 客户端字段级加密
- 审计
- 网络和配置强化
- 实现字段级别修订
- 安全参考
- 附录
- 变更流
- 复制
- 分片
- 分片键
- 哈希分片
- 范围分片
- 区
- 管理分片区
- 按位置细分数据
- 用于更改SLA或SLO的分层硬件
- 按应用或客户细分数据
- 仅插入工作负载的分布式本地写入
- 管理分片区
- 使用块进行数据分区
- 在分片集群中拆分数据块
- 管理
- 存储
- 存储引擎
- 日志记录
- 管理日志记录
- GridFS
- FAQ:MongoDB 存储
- 存储引擎
- 参考
- 运算符
- 查询与映射运算符
- 更新运算符
- 聚合管道阶段
- 聚合管道操作符
- $abs (aggregation)
- $acos (aggregation)
- $acosh (aggregation)
- $add (aggregation)
- $addToSet (aggregation)
- $allElementsTrue (aggregation)
- $and (aggregation)
- $anyElementTrue (aggregation)
- $arrayElemAt (aggregation)
- $arrayToObject (aggregation)
- $asin (aggregation)
- $asinh (aggregation)
- $atan (aggregation)
- $atan2 (aggregation)
- $atanh (aggregation)
- $avg (aggregation)
- $ceil (aggregation)
- $cmp (aggregation)
- $concat (aggregation)
- $concatArrays (aggregation)
- $cond (aggregation)
- $convert (aggregation)
- $cos (aggregation)
- $dateFromParts (aggregation)
- $dateToParts (aggregation)
- $dateFromString (aggregation)
- $literal (aggregation)
- 查询修饰符
- 数据库命令
- 聚合命令
- 地理空间命令
- 查询和写操作命令
- 查询计划缓存命令
- 认证命令
- 用户管理命令
- 角色管理命令
- 复制命令
- 分片命令
- 会话命令
- 管理命令
- 诊断命令
- 免费监控命令
- 系统事件审计命令
- mongo Shell 方法
- 集合方法
- db.collection.aggregate()
- db.collection.bulkWrite()
- db.collection.copyTo()
- db.collection.count()
- db.collection.countDocuments()
- db.collection.estimatedDocumentCount()
- db.collection.createIndex()
- db.collection.createIndexes()
- db.collection.dataSize()
- db.collection.deleteOne()
- db.collection.deleteMany()
- db.collection.distinct()
- db.collection.drop()
- db.collection.dropIndex()
- db.collection.dropIndexes()
- db.collection.ensureIndex()
- db.collection.explain()
- db.collection.find()
- db.collection.findAndModify()
- db.collection.findOne()
- db.collection.findOneAndDelete()
- db.collection.findOneAndReplace()
- db.collection.findOneAndUpdate()
- db.collection.getIndexes()
- db.collection.getShardDistribution()
- db.collection.getShardVersion()
- db.collection.insert()
- db.collection.insertOne()
- db.collection.insertMany()
- db.collection.isCapped()
- db.collection.latencyStats()
- db.collection.mapReduce()
- db.collection.reIndex()
- db.collection.remove()
- db.collection.renameCollection()
- db.collection.replaceOne()
- db.collection.save()
- db.collection.stats()
- db.collection.storageSize()
- db.collection.totalIndexSize()
- db.collection.totalSize()
- db.collection.update()
- db.collection.updateOne()
- db.collection.updateMany()
- db.collection.watch()
- db.collection.validate()
- 词汇表
- 默认的MongoDB端口
- 默认的MongoDB读/写关注
- 服务器会话
- MongoDB驱动
- FAQ
- 联系我们
- 更多资料
- [快学Mongo]
- [Mongo问题讨论区]
- [Mongo 驱动使用手册]
- 本书使用 GitBook 发布
模式验证
模式验证
在本页中
版本3.2中的新功能
MongoDB提供了在更新和插入期间执行模式验证的功能。
指定验证规则
验证规则基于每个集合。
要在创建新集合时指定验证规则,请使用db.createCollection()
使用validator
选项。
若要将文档验证添加到现有集合,请使用collMod
带有 validator
选项的命令。
MongoDB还提供了以下相关选项:
validationLevel
选项,该选项确定MongoDB在更新期间对现有文档应用验证规则的严格程度,以及validationAction
选项,该选项确定MongoDB是否应显示错误并拒绝违反验证规则的文档,或warn
日志中的违反行为,但允许无效文档。
JSON模式
版本3.6中的新功能
从3.6版开始,MongoDB支持JSON模式验证。要指定JSON模式验证,请使用 $jsonSchema
操作validator
表达式中的运算符。
注意
推荐使用JSON模式执行模式验证。
例如,以下示例使用JSON模式指定验证规则:
db.createCollection("students", {
validator: {
$jsonSchema: {
bsonType: "object",
required: [ "name", "year", "major", "address" ],
properties: {
name: {
bsonType: "string",
description: "must be a string and is required"
},
year: {
bsonType: "int",
minimum: 2017,
maximum: 3017,
description: "must be an integer in [ 2017, 3017 ] and is required"
},
major: {
enum: [ "Math", "English", "Computer Science", "History", null ],
description: "can only be one of the enum values and is required"
},
gpa: {
bsonType: [ "double" ],
description: "must be a double if the field exists"
},
address: {
bsonType: "object",
required: [ "city" ],
properties: {
street: {
bsonType: "string",
description: "must be a string if the field exists"
},
city: {
bsonType: "string",
"description": "must be a string and is required"
}
}
}
}
}
}
})
有关详细信息,请参见 $jsonSchema
。
其他查询表达式
除了使用$jsonSchema
操作查询运算符,MongoDB支持使用 其他查询运算符 查询选择器,除了$near
,$nearSphere, $text
,和 $where
运算符。
例如,以下示例使用查询表达式指定验证器规则:
db.createCollection( "contacts",
{ validator: { $or:
[
{ phone: { $type: "string" } },
{ email: { $regex: /@mongodb\.com$/ } },
{ status: { $in: [ "Unknown", "Incomplete" ] } }
]
}
} )
另请参见
行为
在更新和插入期间进行验证。将验证添加到集合时,现有文档在修改之前不会进行验证检查。
现有文档
validationLevel
选项确定MongoDB应用验证规则的操作:
- 如果
validationLevel
是strict
(默认值),MongoDB会对所有插入和更新应用验证规则。 - 如果
validationLevel
是moderate
,MongoDB将验证规则应用于已满足验证条件的现有文档的插入和更新。使用moderate
级别时,不检查对不符合验证条件的现有文档的更新是否有效。
例如,使用以下文档创建 contacts
集合:
db.contacts.insert([
{ "_id": 1, "name": "Anne", "phone": "+1 555 123 456", "city": "London", "status": "Complete" },
{ "_id": 2, "name": "Ivan", "city": "Vancouver" }
])
发出以下命令将验证器添加到 contacts
集合:
db.runCommand( {
collMod: "contacts",
validator: { $jsonSchema: {
bsonType: "object",
required: [ "phone", "name" ],
properties: {
phone: {
bsonType: "string",
description: "must be a string and is required"
},
name: {
bsonType: "string",
description: "must be a string and is required"
}
}
} },
validationLevel: "moderate"
} )
这 contacts
集合现在有一个使用 moderate
验证级别的验证器:
- 如果试图更新
_id
为1, MongoDB将应用验证规则,因为现有文档与条件匹配。 - 相反,MongoDB不会对
_id
为2的文档应用验证规则,因为它不符合验证规则。
要完全禁用验证,可以将validationLevel
设置为off
。
接受或拒绝无效文档
validationAction
选项确定MongoDB如何处理违反验证规则的文档:
- 如果
validationAction
为error
(默认值),MongoDB将拒绝任何违反验证条件的插入或更新。 - 如果
validationAction
为warn
,MongoDB会记录任何冲突,但允许继续插入或更新。
例如,使用以下JSON模式验证器创建一个contacts2
集合:
db.createCollection( "contacts2", {
validator: { $jsonSchema: {
bsonType: "object",
required: [ "phone" ],
properties: {
phone: {
bsonType: "string",
description: "must be a string and is required"
},
email: {
bsonType : "string",
pattern : "@mongodb\.com$",
description: "must be a string and match the regular expression pattern"
},
status: {
enum: [ "Unknown", "Incomplete" ],
description: "can only be one of the enum values"
}
}
} },
validationAction: "warn"
} )
使用warn
validationAction
,MongoDB会记录任何冲突,但允许继续插入或更新。
例如,以下插入操作违反了验证规则:
db.contacts2.insert( { name: "Amanda", status: "Updated" } )
不过,由于validationAction
仅为warn
,MongoDB只记录验证冲突消息并允许操作继续:
2017-12-01T12:31:23.738-0500 W STORAGE [conn1] Document would fail validation collection: example.contacts2 doc: { _id: ObjectId('5a2191ebacbbfc2bdc4dcffc'), name: "Amanda", status: "Updated" }
限制
不能为admin
、local
和config
数据库中的集合指定验证器。
不能为 system.*
集合指定验证器。
绕过文档验证
用户可以使用bypassDocumentValidation
选项绕过文档验证。
以下命令可以使用新选项bypassDocumentValidation
跳过每个操作的验证:
applyOps
命令findAndModify
命令和db.collection.findAndModify()
方法mapReduce
命令和db.collection.mapReduce()
方法insert
命令update
命令- 为
聚合
命令和db.collection.aggregate()
方法提供的过程命令$out
和$merge
对于已启用访问控制的部署,若要绕过文档验证,经过身份验证的用户必须具有bypassDocumentValidation
行动。内置角色dbAdmin
和 restore
提供此操作。
附加信息
另请参见
collMod
, db.createCollection()
, db.getCollectionInfos()
。
译者:张鹏
原文链接:https://docs.mongodb.com/manual/core/schema-validation/
Copyright © 上海锦木信息技术有限公司 all right reserved,由 MongoDB汉化小组 提供技术支持文件修订时间: 2020-10-11 20:53:05