MongoError,错误:E11000重复键错误

dan*_*any 26 javascript mongoose mongodb node.js

我有像这样的MongoDb架构

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

我正在尝试创建一个新用户 这是在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' });
                    }
                });
};
Run Code Online (Sandbox Code Playgroud)

对于创建新用户,我给出的属性和值如下:

 {
"UserName": "ann",
"Email": "ann@ann.com",
"UserType": "normaluser",
"Password":"123456"
}
Run Code Online (Sandbox Code Playgroud)

我收到这样的错误:

{"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}}
Run Code Online (Sandbox Code Playgroud)

我知道这个错误是因为UserName是重复的,但我没有设置具有唯一约束的UserName.每当我添加一个新行时,我只需要电子邮件是唯一的,UserName可以重复.如何实现这一点?

rdr*_*rey 24

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

启动一个mongo控制台并运行medinfo.users.getIndexes()?必须在'UserName'上添加一个索引.

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

  • 是的,在用户(集合)上创建了一个索引,我使用`medinfo.users.getIndexes()`列出了用户的索引,并删除了UserName上的索引.这解决了这个问题. (3认同)

Cla*_*MBE 10

应该有一个阻塞的索引.

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

medinfo.users.dropIndexes()