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

MongoDB不同用户创建同名分类报E11000重复键错误(Node.js)

解决MongoServerError E11000重复键错误

问题根源

虽然你的Category模型中name字段未设置unique: true,但MongoDB数据库的planit.categories集合上已存在name_1的全局唯一索引,这导致不同用户创建同名分类时触发重复键校验失败。

解决步骤

1. 确认数据库索引情况

先通过MongoDB Shell或Compass查看集合的所有索引,验证是否存在name字段的唯一索引:

# MongoDB Shell 命令
db.categories.getIndexes()

返回结果中如果包含类似以下条目,说明存在全局唯一索引:

{
  "v" : 2,
  "key" : { "name" : 1 },
  "name" : "name_1",
  "unique" : true
}

2. 选择对应解决方案

根据你的业务需求(不同用户可创建同名分类),有两种处理方式:

方案A:删除全局唯一索引(推荐)

如果不需要限制name字段全局唯一,直接删除该索引即可:

# MongoDB Shell 命令
db.categories.dropIndex("name_1")

操作完成后,重启Node.js服务,不同用户即可创建同名分类。

方案B:创建用户维度的复合唯一索引(更严谨)

如果需要限制同一用户不能创建同名分类,但不同用户可以,建议创建createdBy + name的复合唯一索引:

  1. 先删除旧的name_1索引(执行方案A中的删除命令)
  2. 修改Category模型,添加复合索引:
const mongoose = require('mongoose');

const categorySchema = new mongoose.Schema({
  userPrefixName: {
    type: String,
    required: true,
    unique: true,
    trim: true,
  },
  name: {
    type: String,
    trim: true,
  },
  tasks: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: "Task"
  }],
  createdBy: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'User',
    required: true,
  }
}, {
  // 添加复合唯一索引:同一用户下name不能重复
  indexes: [
    { unique: true, fields: ['createdBy', 'name'] }
  ]
});

const Category = mongoose.model('Category', categorySchema);

module.exports = Category;
  1. 重启Node.js服务,Mongoose会自动同步该复合索引到数据库。

额外说明

  • 你的userPrefixName字段已设置unique: true,该字段是username + name的组合,本身已能保证全局唯一,但本次报错是由name字段的独立索引导致,因此需优先处理name相关的索引。
  • Mongoose默认会在服务启动时同步schema定义的索引,但手动创建的索引不会自动删除,因此必须手动清理旧的全局唯一索引。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 17:23:12