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信息.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM