删除Cnic字段后MongoDB报E11000重复键错误的原因及解决办法
报错原因
你遇到的E11000 duplicate key error是因为MongoDB的唯一索引是存储在集合层面的,和Mongoose Schema没有直接绑定关系:
- 你此前在Schema中给
cnic字段设置unique: true约束时,Mongoose已经自动在MongoDB的archiwiz.clients集合里创建了名为cnic_1的唯一索引。 - 后续你仅删除了Schema中的
cnic字段,并没有手动删除数据库里遗留的cnic_1唯一索引,这个索引依然会生效。 - 当你不传入
cnic字段写入数据时,MongoDB会默认将不存在的cnic字段值判定为null:第一条数据写入时cnic: null没有冲突,第二条数据写入时又出现cnic: null,就会触发唯一值重复的报错。
解决方案
根据你的业务场景可以选择对应处理方式:
- 开发环境/集合内无重要数据:直接删除
clients集合即可,后续写入数据时Mongoose会按最新Schema重建集合和索引,这也是你实测生效的方案。 - 生产环境/集合内有需要保留的数据:手动删除遗留的唯一索引即可,操作方式如下:
- 打开MongoDB Shell,切换到
archiwiz库,执行命令:db.clients.dropIndex("cnic_1") - 也可以在Mongoose代码中临时加一行执行一次:
Client.dropIndex("cnic_1"),执行成功后删除这行代码即可。
- 打开MongoDB Shell,切换到
额外注意:Mongoose默认只会自动创建新增的索引,不会主动删除Schema中已经移除的旧索引,修改涉及唯一约束的字段后,务必同步检查数据库中的索引状态,避免出现类似遗留问题。
内容的提问来源于stack exchange,提问作者Shehryar Tanoli
相关产品推荐
相关产品推荐

