Mongoose新增第二个商品报11000重复键错误 新增更新接口异常
故障原因
你碰到的是MongoDB典型的唯一键冲突错误,错误码11000直接对应这类问题,从错误返回值可以定位到冲突点:
- 冲突索引是
Name字段的升序唯一索引 - 触发冲突的值是
null
这个问题和你当前贴出的ProductSchema不匹配——你现在的Schema里根本没有定义Name字段,说明你之前调试代码时,曾经给Product模型加过Name字段的唯一约束,Mongoose自动在集合里创建了对应的唯一索引;后续你修改Schema删除了Name字段,但数据库层面的旧索引不会自动同步删除,一直残留在products集合上。
现象完全和这个原因对应:
- 第一次添加商品能成功:因为新文档没有
Name字段,索引里写入第一个null值,非稀疏的唯一索引允许单个null存在 - 第二次添加商品报错:新文档同样没有
Name字段,索引要写入第二个null值,直接触发唯一约束冲突 - PUT更新请求失效:更新操作写入文档时同样会经过MongoDB的索引校验,碰到重复
null值就会抛错 - DELETE请求正常:删除操作不涉及索引写入校验,不受残留索引影响
修复步骤
删除集合上残留的无效索引
直接连接MongoDB执行命令删除即可,你可以选任意一种方式操作:- 在Mongo Shell或Compass可视化工具里,切换到对应业务库执行:
db.products.dropIndex({ "Name": 1 })- 直接在Mongoose代码里,模型初始化后加入如下逻辑自动清理:
// 放在Product模型导出之后即可 Product.collection.dropIndex("Name_1", (err) => { if (err && err.code !== 27) console.log("旧索引清理异常:", err.message); });错误码27对应「索引不存在」的场景,加这个判断可以避免服务启动时打印无意义的报错。
校验当前Schema的索引配置
你当前Schema里给title字段配置了unique: true约束,这个会自动创建title的唯一索引,后续新增/修改商品时要保证title值不重复,否则会触发同类11000错误。如果不需要title全局唯一,直接删掉这个配置项即可。
修复完成后重启Node服务,再测试新增、更新接口就可以正常运行了。
内容的提问来源于stack exchange,提问作者Ajmal Rahman
相关产品推荐
相关产品推荐

