亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

mongodb字段驗證規則(schema validation)

標簽:
MongoDB

在我们通常的印象中,mongodb是模式自由的(schemaless),可以往一个集合里插入任意类型的数据,这会带来一些问题,例如对于PHP这种弱类型的语言,一个本应该是int型的字段,可能会同时存在string和int类型的数据。

例如一个集合members,存储会员信息,包含的文档如下

> db.members.find();
{ "_id" : ObjectId("5b62a5c73eeb75204f15dbe3"), "user_id" : 100, "level" : "vip" }
{ "_id" : ObjectId("5b62a5cb3eeb75204f15dbe4"), "user_id" : 101, "level" : "vip" }
{ "_id" : ObjectId("5b62a5db3eeb75204f15dbe5"), "user_id" : "102", "level" : "gold" }
{ "_id" : ObjectId("5b62a5e53eeb75204f15dbe6"), "user_id" : 102, "level" : "gold" }

集合中有user_id为102和"102"的两个文档,按user_id查询

> db.members.find({user_id:{$eq:102}});
{ "_id" : ObjectId("5b62a5e53eeb75204f15dbe6"), "user_id" : 102, "level" : "gold" }
> db.members.find({user_id:{$eq:"102"}});
{ "_id" : ObjectId("5b62a5db3eeb75204f15dbe5"), "user_id" : "102", "level" : "gold" }

可以看出102和"102"查询出了不同的结果。

问题来了,开发语言为弱类型语言,导致同一个字段写入了不同类型的值,这很容易引起bug。

是否可以对mongodb的字段类型进行约束呢?很不幸,mongodb 3.2之前的版本不支持本操作。

幸运的是,mongodb从版本3.2开始引入了schema validation,可以为集合指定验证规则。

我们为members集合指定验证规则,限定user_id必须为int类型,且不可或缺。

> db.runCommand({collMod:"members", validator:{$and:[{"user_id":{$type:"int", $exists:true}}]}});
{ "ok" : 1 }

尝试插入user_id为string类型的数据,可以看出验证失败了。

> db.members.insert({user_id:"102", level:"gold"});
Document failed validation

我们还可以在创建集合时就指定验证规则

> db.createCollection("test_members", {validator:{$and:[{"user_id":{$type:"int", $exists:true}}]}});
{ "ok" : 1 }



作者:solohunter
链接:https://www.jianshu.com/p/ef4e29ff0d62

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消