Node.js搭配MongoDB开发E11000重复键报错设置unique:false无效如何解决
MongoDB E11000重复键错误解决方案
报错原因
你遇到的E11000 duplicate key error和当前的Schema配置无关,问题出在MongoDB集合残留了旧的唯一索引:
- 你之前大概率在Schema中定义过名为
key的字段,且设置了unique: true,MongoDB会自动为该字段创建名为key_1的唯一索引 - 后续你删除了
key字段、或者修改了unique配置后,MongoDB不会自动删除已经创建的索引 - 你现在的Schema中没有
key字段,插入数据时MongoDB会自动给该字段赋值为null:第一条数据插入时null值可以正常写入,第二条数据再插入null就会触发唯一索引的重复校验,因此报错
解决步骤
- 步骤1:删除残留的唯一索引
你可以通过Mongo Shell或者MongoDB Compass工具操作:- 如果使用Mongo Shell,先切换到
myFirstDatabase数据库,执行以下命令:
执行成功返回db.files.dropIndex("key_1"){ "nIndexesWas" : N, "ok" : 1 }即代表索引删除完成
2. 如果使用MongoDB Compass可视化工具,打开myFirstDatabase的files集合,切换到「Indexes」标签页,找到名称为key_1的索引点击删除即可 - 如果使用Mongo Shell,先切换到
- 步骤2:验证功能
索引删除完成后重启Node服务,再次调用接口创建第二条文件数据,即可正常写入
注意事项
Mongoose只会自动创建新增的索引,不会自动删除已经失效的旧索引。后续如果修改Schema的unique约束、或者删除了之前设置过unique的字段,一定要手动到数据库中删除对应的旧索引,避免出现类似的重复键错误。
内容的提问来源于stack exchange,提问作者Matteo Possamai
相关产品推荐
相关产品推荐

