MongoError,错误:E11000重复键错误

时间:2012-11-19 12:49:21

标签: javascript node.js mongodb mongoose

我有像这样的MongoDb架构

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

我正在尝试创建一个新用户 这是在NodeJs中使用mongoose ODM 完成的 这是创建代码:

    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' });
                    }
                });
};

为了创建新用户,我给出了如下属性和值:

 {
"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。每当我添加一个新行时,我只需要电子邮件是唯一的,UserName可以重复。如何实现这一目标?

5 个答案:

答案 0 :(得分:24)

@ManseUK可能是对的,看起来UserName是一个'键' - 在这种情况下是一个索引。 _id属性是"主要"默认情况下创建的索引,但mongodb允许您拥有多个这些索引。

启动mongo控制台并运行medinfo.users.getIndexes()?必须在' UserName'。

上添加索引

required: true不会这样做,但您之前可能已经使用过其他设置并且索引尚未删除?

答案 1 :(得分:9)

应该有一个阻止的索引。

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

medinfo.users.dropIndexes()

答案 2 :(得分:0)

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

您可能需要获取mongoose-version模块,执行thing.remove({}, ...)甚至删除该集合:drop database with mongoose

我使用RoboMongo作为管理工具(我强烈推荐它!)所以我只是从控制台进入并右键单击/删除了集合。

如果有人知道如何从代码中轻松地版本化和/或删除集合,请随时在下面发表评论,因为它肯定有助于这个帖子(和我:)。

答案 3 :(得分:0)

我在项目中遇到了类似的问题。我试图清除所有文件,但问题仍然存在。直到我删除此集合并重新启动我的节点服务,它才起作用。

答案 4 :(得分:-1)

此错误背后的原因是,您尝试在其中插入的集合中不存在索引或索引不同。 因此,解决方案是删除该集合,然后再次运行您的程序。