前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MongoDB 案例:Document failed validation 错误

MongoDB 案例:Document failed validation 错误

原创
作者头像
王文安@DBA
修改2020-08-28 15:10:42
2.9K0
修改2020-08-28 15:10:42
举报

问题表现

插入或者更新数据的时候,MongoDB 返回"code" : 121,"errmsg" : "Document failed validation"

问题原因

MongoDB 是无模式(schemaless)的数据库,一个集合内可以插入各种不同字段内容的数据,如对一个集合可以插入拥有不同字段,不同类型的文档记录:

演示实例
演示实例

schemaless 的特性让 MongoDB 使用起来很便利,同时也给运维带来了很大的麻烦,特别是字段类型没有做强校验的时候,可能会导致程序出现 bug(如上例,同样是 age 字段,有一个 int 类型,还有一个 string 类型,如果程序没有做强校验就会出问题)。

MongoDB 在 3.2 版本开始引入了 schema validation,可以给集合设置指定验证规则,如在创建集合的时候指定

代码语言:javascript
复制
validation:
db.createCollection("col2",{validator:{$and:{name:{$type:"string"}},{age:{$type:"int"}}}})

尝试插入不符合规则的文档,报 "Document failed validation"。

报错信息
报错信息

尝试插入包含 name 和 age 的文档,发现仍然有报错,这是因为 json 格式只有 number 类型,并没有细分 int、double 之类的数字,mongo shell 在保存数据的时候,全部存为了 double 类型,所以模式校验出错。

报错信息
报错信息

要插入 int 类型的数字,需要指定 NumberInt() 的方法,插入成功

成功示例
成功示例

怎么解决

1. 既然集合创建了 validation,建议在插入记录的时候,严格按照 validation 的规则进行。

要查看集合的 validation 规则,可以执行db.getCollectionInfos({name:"collectionname"}),如

查看规则
查看规则

2. 如果确定不需要使用 validation 的规则,可以设置 validation level 为 off,不校验规则(关闭前一定要和开发核实清楚,避免程序出 BUG):db.runCommand({ collMod: "col2",validationLevel:"off"})

关闭规则
关闭规则

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题表现
  • 问题原因
  • 怎么解决
相关产品与服务
云数据库 MongoDB
腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档