You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mongoose新增第二个商品报11000重复键错误 新增更新接口异常

故障原因

你碰到的是MongoDB典型的唯一键冲突错误,错误码11000直接对应这类问题,从错误返回值可以定位到冲突点:

  • 冲突索引是Name字段的升序唯一索引
  • 触发冲突的值是null

这个问题和你当前贴出的ProductSchema不匹配——你现在的Schema里根本没有定义Name字段,说明你之前调试代码时,曾经给Product模型加过Name字段的唯一约束,Mongoose自动在集合里创建了对应的唯一索引;后续你修改Schema删除了Name字段,但数据库层面的旧索引不会自动同步删除,一直残留在products集合上。

现象完全和这个原因对应:

  • 第一次添加商品能成功:因为新文档没有Name字段,索引里写入第一个null值,非稀疏的唯一索引允许单个null存在
  • 第二次添加商品报错:新文档同样没有Name字段,索引要写入第二个null值,直接触发唯一约束冲突
  • PUT更新请求失效:更新操作写入文档时同样会经过MongoDB的索引校验,碰到重复null值就会抛错
  • DELETE请求正常:删除操作不涉及索引写入校验,不受残留索引影响
修复步骤
  1. 删除集合上残留的无效索引
    直接连接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对应「索引不存在」的场景,加这个判断可以避免服务启动时打印无意义的报错。

  2. 校验当前Schema的索引配置
    你当前Schema里给title字段配置了unique: true约束,这个会自动创建title的唯一索引,后续新增/修改商品时要保证title值不重复,否则会触发同类11000错误。如果不需要title全局唯一,直接删掉这个配置项即可。

修复完成后重启Node服务,再测试新增、更新接口就可以正常运行了。

内容的提问来源于stack exchange,提问作者Ajmal Rahman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 22:42:14