MongoDB3.2新特性之文档验证
官方参考: https://docs.mongodb.org/master/core/document-validation/
文档验证是3.2的重要新特性,添加验证条件的情形无非两种,一是在创建集合的时候就添加验证条件。二是在已存在的集合上添加验证.下面就介绍这种情况的操作方式.
1.新建集合的时候添加验证
使用db.createCollection()函数的时候添加validator属性.
格式:
db.createCollection('tableName',{
validator:{$or:
[
{phone:{$type:"string"}},
{status:{$in:["Unknow","Incomplete"]}}
],
validationAction:"error"
}
})
显然这要求tableName集合中phone字段必须是String类型,status必须是"Unknows","Incomplete"中的其中一个.
这里其实还隐含了一个条件,就是tableName集合必须要有这两个属性中的一个.
validatioinAction属性
这个属性决定了如何处理违反验证规则的数据,有两个值error,warn
error,默认值.在插入不符合验证的文档时候,会直接报错并阻止不符合条件的文档插入.
warn,警告. 在插入不符合验证的文档时候,会在log中生产警告记录,但文档仍然可以插入成功.

2.給已存在的集合添加文档验证
使用collMod来创建,现有一个集合contact2,有数据如下:
{
"_id" : "860000",
"name" : "Ivan",
"city" : "Vancouver"
}
{
"_id" : "125876",
"name" : "Anne",
"phone" : "+1 555 123 456",
"city" : "London",
"status" : "Complete"
}
现给contact2添加文档验证,要求后续文档的内容必须满足条件:phone或者email至少有一个
db.runCommand({
collMod:"contacts2", //集合名称
validator:{$or:[{phone:{$exists:true}},{email:{$exists:true}}]},
validationLevel:"moderate"
})
validationLevel属性
这个属性决定了验证条件对已经存在的数据的执行效果.它有三个值off,strict,moderate
strict是默认值,这时mongodb对于所有insert和update都严格执行验证规则.
off 对所有的update都不执行验证规则
moderate,当更新已经存在的并没有满足验证规则的数据时,不会执行验证.
此例中如果设置validationLevel:moderate,产生的效果是创建验证后,如果你试图修改_id:125876的记录,则会触发验证规则.如果你试图修改_id:860000的记录,则可任意修改,不受验证规则的限制.
如果设置validationLevel:off. 在修改id:125876的数据时候不受到验证条件的干扰.
3.插入数据时避开验证
在插入或者更新文档的时候,可以通过bypassDocumentValidation:属性来避开验证
db.runCommand()支持这个属性
如:db.runCommand({
insert:"collectionName",
documents:[{},{}....],
writeConcern:{},
bypassDocumentValidation:
}),
db.runCommand({
update:,
upates:[
{q:,u:,upsert:,multi:},
{q:,u:,upsert:,mutil:},
.....
writeConcern:{}
bypassDocumentValidation:
]
})
但是db.collection.insert/update()方法不支持这个属性.而db.collection.mapReduce(),db.collection.aggretate()方法支持这个属性.
4.其他注意的地方
1.admin.local以及config数据库中的集合不能添加验证.
2.system.*里面的集合也不能添加验证.
5.其他相关命令
1.db.getCollectionInfos()------这个命令可以查看数据库表所有集合的验证条件
2.db.getCollectinInfos({name:"collectionName"})---查看指定表的validation信息.
MongoDB3.2新特性之文档验证的更多相关文章
- Html5新特性之文档声明和头部信息
Html5推出的新内容比较多,本文我们来介绍两个重点内容,文档类型声明和头部信息. 无论是Html4.01还是XHtml1.0,所有文档的开头都会有文档声明<!DOCTYPE>标签来声明它 ...
- java.lang.NoSuchFieldError: RAW_XML_FILE_HEADER,调用XWPFTemplate动态合并生成一个新的docx文档时报错
在使用 org.apache.poi 对office文件 根据表单内容和已上次的附件 动态合并成一个新的文档时,本地调试完全ok 但是发布倒Linux环境上就老是报这个错误java.lang.NoS ...
- 《Javascript权威指南》学习笔记之十九--HTML5 DOM新标准---处理文档元信息和管理交互能力
一.了解DOM 1.DOM是Document Object Model的缩写,即文档对象类型,是文档在内存中的表示形式,是一个应用程序接口,定义了文档的逻辑结构以及一套訪问和处理文档的方法. 2.HT ...
- 12c分区增强功能,新功能(文档ID 1568010.1)
12c Partitioning Enhancements, New Features (Doc ID 1568010.1) APPLIES TO: Oracle Database - Enterpr ...
- MongoDB3.0新特性
3月3日,MongoDB3.0终于发布了. 主要特点包括了对之前收购的WiredTiger存储引擎的支持,插件式存储引擎API,SCRAM-SHA-1认证机制,并改进了解释功能.此外,包含了自动化.备 ...
- MongoDB3.2新特性之部分索引
官方介绍:https://docs.mongodb.org/manual/core/index-partial/ mongodb3.2支持对某个集合的部分数据创建索引.如给年龄大于十八岁的数据创建索引 ...
- 【Ansible 文档】【译文】Playbooks 变量
Variables 变量 自动化的存在使得重复的做事情变得很容易,但是我们的系统不可能完全一样. 在某些系统中,你可能想要设置一些与其他系统不一样的行为和配置. 同样地,远程系统的行为和状态也可以影响 ...
- C# 6.0中你不知道的新特性
为什么写? 今天去上班的公交上,有朋友在张队(张善友)的微信群里,发了一个介绍C# 6.0新特性的视频,视频7分钟,加上本人英语实在太low,整体看下来是一脸懵逼的. 下班回到家里,打开这个视频,把视 ...
- asp.net 将word文档进行编辑并导出一个新的word
最近做项目,需要多word文档进行编辑并导出一个新的word,在最初的word编辑中留下特定的字符串用来替换,然后在本地生成一个新的word文档,并且不修改服务器中的word文档,这样才能保证服务器中 ...
随机推荐
- php隐藏手机号指定位数
function mobileReplace($mobile,$start,$end,$str="*"){ $countStr = abs($end-$start); $repla ...
- ionic2项目中实现md5加密
1. 安装插件 npm i ts-md5 --save 2. 在项目中引用 import { Md5 } from 'ts-md5/dist/md5'; ... ionViewDidLoad() { ...
- 20172328 2018-2019《Java软件结构与数据结构》第四周学习总结
20172328 2018-2019<Java软件结构与数据结构>第四周学习总结 概述 Generalization 本周学习了第六章·列表,主要让我们认识列表以及分析各种列表实现. 教材 ...
- UVA 548 Tree 建树
题意: 输入中序和后序的权值,输出哪个叶子使它到根的路径上权和最小. 思路: 输入后建树,然后dfs求最小的叶子. #include<iostream> #include<cstdi ...
- java线程之二(synchronize和volatile方法)
要说明线程同步问题首先要说明Java线程的两个特性,可见性和有序性.多个线程之间是不能直接传递数据交互的,它们之间的交互只能通过共享变量来实现.拿上篇博文中的例子来说明,在多个线程之间共享了Count ...
- SDOI2018:原题识别
题解: https://files.cnblogs.com/files/clrs97/old-solution.pdf Code: #include<cstdio> #include< ...
- angular.js使用ui-router注入报错,这里是版本问题导致的
报错如下: common.ts:604Uncaught SyntaxError: Unexpected token ) stateEvents.ts:211Uncaught SyntaxError: ...
- win10安装ubuntu16.04双系统历程
目录 win10安装ubuntu16.04双系统 历程 安装时间 安装准备 安装过程 其他问题 win10安装ubuntu16.04双系统 历程 安装时间 2018.11.30 安装准备 u盘(格式化 ...
- XAMPP 安装时 MySQL 无法启动,且提示端口占用。
今天安装XAMPP时遇到了几个坑,忙活了一上午才搞定,写下来分享给同样遇坑的盆友们. MySQL 点击start 提示端口3306被占用,我改了端口号,又改了注册表,将注册表地址改为xampp中mys ...
- eclipse maven工程打包失败
报错如下: Maven install失败 Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:comp ...