官方参考: 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. JSONP ---------跨域

    什么是跨域 JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦.这里把涉及到跨域的一些问题简单地整理一下: 首 ...

  2. 拷贝JAR包

    package com.cici; import java.io.File; import java.io.FileInputStream; import java.util.ArrayList; i ...

  3. centos6.5安装nginx+python+uwsgi+django

    nginx+uwsgi+django环境部署及测试 默认系统自带的python2.6.6 第一步(安装setuptools) wget https://pypi.python.org/packages ...

  4. mac下启动mysql

    mac下使用mysql有点蛋疼,每次都要找命令.可能不同版本或者安装方式mysql的位置不太一样, 可以使用locate mysql.server查找一下. # start sudo /usr/loc ...

  5. img标签与span一起使用不在同一条线上

    布局时 img标签与span标签在同一行是不能垂直,解决办法:在 img标签添加一个 vertical-align:middle; 即 <!-- img与span的文字与图片保持同一条水平线 在 ...

  6. Angularjs判断页面是否已经渲染结束(动态给标签长度)

    相信大家都会碰到这样的问题.页面循环li.但是因为个数不知道.没有办法给li设置固定宽度.那么这时就需要动态计算数据长度并动态改变li的宽度 <!--周边信息--> <div cla ...

  7. [LeetCode] Random Flip Matrix 随机翻转矩阵

    You are given the number of rows n_rows and number of columns n_cols of a 2D binary matrix where all ...

  8. C语言面试题分类->位运算

    1.不用临时变量交换两个整数. a = a ^ b; b = a ^ b; a = a ^ b; 2.实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如9的二进制是1001,则输出2. i ...

  9. Unity 和android 交互 记录

    参考文章 http://www.jianshu.com/p/c06063a403c6 趟坑如下 icon 冲突问题: 设置不了unity icon,显示的是默认的 android 小人 解决方法: 在 ...

  10. 使用Eureka作为springcloud的注册机

    使用springcloud做项目的负载均衡,需要导的jar这里不再显示,具体配置如下: 作为被注册服务配置: 启动多台服务端就可以实现集群,相应的localhost需要转成真实的ip 当然一个项目还要 ...