MongoDB报E11000重复键错误,删除username唯一索引后每次请求自动重建如何解决
问题根因
你给Compny模型对应的Schema注册了passport-local-mongoose插件,这个插件的默认行为就是自动向Schema注入username和password两个字段,并且强制给username字段创建unique: true的唯一索引。你手动在数据库删除索引后,只要Mongoose触发索引同步(比如服务重启、第一次操作Compny集合),插件定义的索引就会被重新创建,所以会反复出现报错。
且你当前Compny集合内的文档都没有username字段,所有文档的username值默认都是null,插入第二条文档时就会触发唯一键冲突,也就是你看到的dup key: { username: null }报错。
解决步骤
情况1:Compny模型不需要用Passport的登录鉴权能力
直接删掉公司模型里的这行代码即可:
compnySchema.plugin(passportLocalMongoose);
删完之后执行两步操作:
- 重启你的Node服务
- 手动删除一次已经存在的
username_1索引:
db.compnies.dropIndex("username_1")
之后索引就不会再被自动创建。
情况2:确实需要在Compny模型上使用passport-local-mongoose
给插件传配置,关闭username的唯一索引约束,或者指定你自己的唯一标识字段即可:
// 关闭username的唯一索引要求 compnySchema.plugin(passportLocalMongoose, { usernameUnique: false }); // 如果你的公司模型用name字段做唯一标识,也可以直接指定用户名字段为name,避免额外生成username字段 // compnySchema.plugin(passportLocalMongoose, { // usernameField: "name" // });
修改后同样重启服务,手动删除一次旧的唯一索引即可。
额外注意
你当前的User模型里自定义了username且设置了unique: false,但因为你也注册了passport-local-mongoose插件,如果不需要username唯一的话也建议给User模型的插件也加上usernameUnique: false配置,避免后续User集合出现同类问题。
内容的提问来源于stack exchange,提问作者Balajee Mishra
相关产品推荐
相关产品推荐

