Подтвердить что ты не робот

MongoError, err: ошибка повторения ключа E11000

У меня есть схема 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": "[email protected]",
"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 можно повторить. Как достичь этого?

4b9b3361

Ответ 1

@ManseUK Вероятно, это правильно, так как UserName - это "ключ" - в этом случае индекс. Атрибут _id - это "первичный" индекс, который создается по умолчанию, но mongodb позволяет иметь несколько из них.

Запустите консоль mongo и запустите medinfo.users.getIndexes()? Что-то должно было добавить индекс в "UserName".

required: true не сделал бы этого, но вы могли бы играть с другими настройками ранее, и индекс не был удален?

Ответ 2

Должен быть заблокированный индекс.

Вы можете попробовать метод db.collection.dropIndex()

medinfo.users.dropIndexes()

Ответ 3

Что я понял, так это то, что мои структуры данных менялись - вот где versioning пригодится.

Вам может потребоваться получить модуль mongoose-version, сделать thing.remove({}, ...) или даже удалить коллекцию: удалить базу данных с помощью мангуста

Я использую RoboMongo для инструмента администрирования (и я очень рекомендую его!), поэтому я просто вошел и щелкнул правой кнопкой мыши/удалил коллекцию с консоли.

Если кто-то знает, как легко сменить версию и/или удалить коллекцию из кода, не стесняйтесь публиковать комментарий ниже, так как он, безусловно, помогает этой теме (и мне:)).

Ответ 4

У меня была аналогичная проблема в моем проекте. Я попытался очистить все документы, и проблема с дублированием все еще продолжает появляться. Пока я не сбросил эту коллекцию и не запустил мою службу node, она просто сработала.

Ответ 5

Причина этой ошибки заключается в том, что индекс отсутствует или отличается в вашей коллекции, в которую вы пытаетесь вставить. Поэтому решение состоит в том, чтобы отбросить эту коллекцию и запустить вашу программу еще раз.