Mongoose调用Model.create插入文档报E11000 name为null重复键错误怎么办
Mongoose E11000 重复键报错排查解决步骤
1. 校验请求参数
- 打印接口接收到的
req.body,确认Postman请求是否未携带name字段,或name字段值为空。若数据模型未配置name的required: true规则,未传该字段时Mongoose会默认向数据库插入name: null。
2. 验证索引属性
- 你遇到的报错是典型的非稀疏唯一索引冲突问题:如果
name字段的唯一索引未开启sparse属性,MongoDB会将所有缺失name字段的文档的索引值统一记为null,只要存在2个及以上没有name字段的文档,就会触发重复键报错,和你现有文档显式设置的name值无关。 - 可在MongoDB Shell执行
db.objects.getIndexes()查询索引配置,找到name_1对应的索引条目,检查是否存在sparse: true配置。
3. 修正Mongoose模型配置
如果你的业务允许部分文档不填name字段,需要在模型的name字段配置中新增稀疏索引规则:
const objectSchema = new mongoose.Schema({ // 其他字段配置 name: { type: String, unique: true, sparse: true, // 开启稀疏索引,仅对存在name字段的文档做唯一性校验 // 其他原有配置 } })
如果业务要求name字段必填,直接在name配置中新增required: true,提前拦截未传name的非法请求。
4. 清理残留旧索引
修改模型配置后如果仍报错,是因为数据库中已经存在旧的非稀疏name_1索引,需要手动删除旧索引:
在MongoDB Shell执行 db.objects.dropIndex("name_1"),之后重启Node服务,Mongoose会自动重建符合新配置的索引。
内容的提问来源于stack exchange,提问作者user13863639
相关产品推荐
相关产品推荐

