官方参考: 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新特性之文档验证的更多相关文章

  1. Html5新特性之文档声明和头部信息

    Html5推出的新内容比较多,本文我们来介绍两个重点内容,文档类型声明和头部信息. 无论是Html4.01还是XHtml1.0,所有文档的开头都会有文档声明<!DOCTYPE>标签来声明它 ...

  2. java.lang.NoSuchFieldError: RAW_XML_FILE_HEADER,调用XWPFTemplate动态合并生成一个新的docx文档时报错

    在使用 org.apache.poi 对office文件  根据表单内容和已上次的附件 动态合并成一个新的文档时,本地调试完全ok 但是发布倒Linux环境上就老是报这个错误java.lang.NoS ...

  3. 《Javascript权威指南》学习笔记之十九--HTML5 DOM新标准---处理文档元信息和管理交互能力

    一.了解DOM 1.DOM是Document Object Model的缩写,即文档对象类型,是文档在内存中的表示形式,是一个应用程序接口,定义了文档的逻辑结构以及一套訪问和处理文档的方法. 2.HT ...

  4. 12c分区增强功能,新功能(文档ID 1568010.1)

    12c Partitioning Enhancements, New Features (Doc ID 1568010.1) APPLIES TO: Oracle Database - Enterpr ...

  5. MongoDB3.0新特性

    3月3日,MongoDB3.0终于发布了. 主要特点包括了对之前收购的WiredTiger存储引擎的支持,插件式存储引擎API,SCRAM-SHA-1认证机制,并改进了解释功能.此外,包含了自动化.备 ...

  6. MongoDB3.2新特性之部分索引

    官方介绍:https://docs.mongodb.org/manual/core/index-partial/ mongodb3.2支持对某个集合的部分数据创建索引.如给年龄大于十八岁的数据创建索引 ...

  7. 【Ansible 文档】【译文】Playbooks 变量

    Variables 变量 自动化的存在使得重复的做事情变得很容易,但是我们的系统不可能完全一样. 在某些系统中,你可能想要设置一些与其他系统不一样的行为和配置. 同样地,远程系统的行为和状态也可以影响 ...

  8. C# 6.0中你不知道的新特性

    为什么写? 今天去上班的公交上,有朋友在张队(张善友)的微信群里,发了一个介绍C# 6.0新特性的视频,视频7分钟,加上本人英语实在太low,整体看下来是一脸懵逼的. 下班回到家里,打开这个视频,把视 ...

  9. asp.net 将word文档进行编辑并导出一个新的word

    最近做项目,需要多word文档进行编辑并导出一个新的word,在最初的word编辑中留下特定的字符串用来替换,然后在本地生成一个新的word文档,并且不修改服务器中的word文档,这样才能保证服务器中 ...

随机推荐

  1. [原创]Zynq AXI-CDMA测试结果

    经过研究与demo,在zynq上使用axi-cmda效率还是很高,测试报告如下所示 对于读取32KB,GP0和HP0的测试结果如下:

  2. 在js中网页面写入数据时需要注意的几点

    网页代码 <tbody id="t_gun"> <s:iterator value="gunList" status="st&quo ...

  3. 远程连接你的linux服务器

    为什么要远程连接linux 在实际的工作场景中,虚拟机界面或者物理服务器本地的终端都是很少接触的,因为服务器装完系统之后,都要拉倒IDC机房托管,如果是购买的云主机,那更碰不到服务器本体了,只能通过远 ...

  4. Jupyter notbook& REVEAL.JS& nbconvert 使用jupyter notebook制作slides

    使用Jupyter notebook作为slide主要有两个方面: 在运行notebook 的时候可以幻灯片播放 这样幻灯片就有了notebook可交互的功能,而notebook就有了幻灯片全屏容易分 ...

  5. 编程菜鸟的日记-初学尝试编程-C++ Primer Plus 第5章编程练习7

    #include <iostream>#include <cstring>const MAXSIZE=100;using namespace std;int main (){  ...

  6. Linux 安装zookeeper

    分享到:   1.下载zokeeper 1.1 官网下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/ 1.2 链接:https:/ ...

  7. css 颜色表示法

    css颜色值主要有三种表示方法: (1)颜色名表示,如:red红色,gold金色 (2)rgb表示,如:rgb(255,0,0)表示红色 (3)16进制数值表示,如:#ff0000表示红色,这种可以简 ...

  8. 函数防抖 & 函数节流

    避免一个函数频繁执行 - 避免程序卡顿 js 是单线程的,setTimeout 这样的函数是异步的 异步的代码,交给对应的模块进行处理 模块在会将异步任务,在主线程执行完所有同步代码后,加入事件队列 ...

  9. jQuery (01) 浏览器的事件模型

    浏览器的事件模型 由网景公司引入的 DOM0 级事件模型 把事件处理程序绑定到 DOM 元素的属性上: ele.onclick(); ele.onDOMContentLoad(); ele.onloa ...

  10. Java作业一 (2017-9-10)

    /*程序员龚猛*/ 1.3 public class Helloworld{  public static void main(String[] args) {   System.out.printl ...