MongoError,错误:E11000重复键错误

我有这样的MongoDb模式

var User = new Schema({ "UserName": { type: String, required: true }, "Email": { type: String, required: true, unique: true }, "UserType": { type: String }, "Password": { type: String } }); 

我想创build一个新的用户这是在使用mongoose ODM的NodeJs中完成的这是创build的代码:

  controller.createUser = function (req, res) { var user = new models.User({ "UserName": req.body.UserName.toLowerCase(), "Email": req.body.Email.toLowerCase(), "UserType": req.body.UserType.toLowerCase() }); models.User.findOne({ 'Email': user.Email }, function (err, olduser) { if (!err) { if (olduser) { res.send({ 'statusCode': 409, 'statusText': 'Email Already Exists' }); } else if (!olduser) { user.setPassword(req.body.Password); user.save(function (err, done) { if (!err) { console.log(user); res.send({ 'statusCode': 201, 'statusText': 'CREATED' }); } else { res.send({ 'Status code': 500, 'statusText': 'Internal Server Error' }); } }); } } else { res.send({ 'statusCode': 500, 'statusText': 'ERROR' }); } }); }; 

为创build新用户,我给如下的属性和值:

  { "UserName": "ann", "Email": "ann@ann.com", "UserType": "normaluser", "Password":"123456" } 

我得到像这样的错误:

 {"Status code":500,"statusText":"Internal Server Error","Error":{"name":"MongoError","err":"E11000 duplicate key error index: medinfo.users.$UserName_1 dup key: { : \"ann\" }","code":11000,"n":0,"connectionId":54,"ok":1}} 

我明白,这个错误是因为UserName是重复的,但我没有设置唯一的约束UserName。每当我添加一个新的行,我只需要电子邮件是唯一的,用户名可以重复。如何实现这?

@ManseUK可能是正确的,看起来像UserName是一个“关键” – 在这种情况下,一个索引。 _id属性是默认创build的“主”索引,但mongodb允许您拥有多个这样的索引。

启动一个mongo控制台并运行medinfo.users.getIndexes() ? 某些东西必须在“UserName”上添加一个索引。

required: true不会这样做,但你可能以前玩过其他设置,索引还没有被删除?

应该有一个阻塞的索引。

您可以尝试db.collection.dropIndex()方法

medinfo.users.dropIndexes()

我所意识到的是,我的数据结构正在发生变化 – 这正是versioning派上用场的地方。

你可能需要得到一个mongoose-version模块,做一个thing.remove({}, ...)甚至删除集合: drop database with mongoose

我使用RoboMongo作为pipe理工具(我强烈推荐它!),所以我刚刚进入并右键单击/从控制台丢弃收集。

如果有人知道如何轻松地在代码中进行版本化和/或删除,那么可以在下面发表评论,因为它肯定有助于这个主题(和我:)。

我在我的项目上遇到类似的问题。 我试图清除所有的文件,dup问题仍然不断popup。 在我放弃这个集合并重新启动我的节点服务之前,它才起作用。