在我们通常的印象中,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 }
参考文档
https://docs.mongodb.com/manual/reference/command/collMod/#dbcmd.collMod
https://www.compose.com/articles/document-validation-in-mongodb-by-example/
作者:solohunter
链接:https://www.jianshu.com/p/ef4e29ff0d62
点击查看更多内容
1人点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦