E11000 дублирует ключевой индекс ошибки в mongodb mongoose

Ниже приведена моя схема user в модели user.js -

var userSchema = new mongoose.Schema({
    local: {
        name: { type: String },
        email : { type: String, require: true, unique: true },
        password: { type: String, require:true },
    },
    facebook: {
        id           : { type: String },
        token        : { type: String },
        email        : { type: String },
        name         : { type: String }
    }
});

var User = mongoose.model('User',userSchema);

module.exports = User;

Вот как я использую его в своем контроллере -

var user = require('./../models/user.js');

Вот как я сохраняю его в db -

user({'local.email' : req.body.email, 'local.password' : req.body.password}).save(function(err, result){
    if(err)
        res.send(err);
    else {
        console.log(result);
        req.session.user = result;
        res.send({"code":200,"message":"Record inserted successfully"});
    }
});

Ошибка -

{"name":"MongoError","code":11000,"err":"insertDocument :: caused by :: 11000 E11000 duplicate key error index: mydb.users.$email_1  dup key: { : null }"} 

Я проверил коллекцию db и нет такой дублированной записи, дайте мне знать, что я делаю неправильно?

FYI - req.body.email и req.body.password извлекают значения.

Я также проверил этот пост, но не помог STACK LINK

ИЗМЕНИТЬ

Если я полностью удалю, он вставляет документ, в противном случае выдает ошибку "Дублировать", даже если у меня есть запись в local.email

Ответ 1

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

Соответствующая документация для этого:

Если документ не имеет значения для индексированного поля в уникальном индексе, индекс будет хранить нулевое значение для этого документа. Из-за уникального ограничения MongoDB разрешит только один документ, в котором отсутствует индексированное поле. Если имеется более одного документа без значения для проиндексированного поля или отсутствует индексированное поле, сборка индекса завершится с ошибкой повторяющегося ключа.

Вы можете комбинировать уникальное ограничение с разреженным индексом для фильтрации этих нулевых значений из уникального индекса и избежать ошибки.

уникальные индексы

Разреженные индексы содержат только записи для документов с индексированным полем, даже если поле индекса содержит нулевое значение.

Другими словами, разреженный индекс в порядке с несколькими документами, все из которых имеют значения null.

редкие индексы

Ответ 2

Если вы все еще находитесь в своей среде разработки, я бы сбросил весь db и начал с новой схемы.

Из командной строки

➜ mongo
use dbName;
db.dropDatabase();
exit

Ответ 3

Проверить индексы коллекции.

У меня была эта проблема из-за устаревших индексов в коллекции для полей, которые должны храниться по другому новому пути.

Mongoose добавляет индекс, когда вы указываете поле как уникальное.

Ответ 4

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

Это работает после этого, это также происходит, когда нет уникального ключа для разделения двух документов друг от друга.

Если вы используете оболочку, вы можете сбросить db через -

db.users.drop();

Надеюсь, это помогло:)

Ответ 5

Это мой любимый опыт:

В схеме "Пользователь" я установил "имя" как уникальный ключ, а затем выполнил некоторое выполнение, которое, я думаю, установило структуру базы данных.

Затем я изменил уникальный ключ как "имя пользователя" и больше не передал значение "name" , когда я сохранил данные в базе данных. Таким образом, mongodb может автоматически устанавливать значение "name" новой записи как null, которое является дубликатным ключом. Я попробовал ключ "name" как не уникальный ключ {name: {unique: false, type: String}} в схеме "Пользователь", чтобы переопределить исходные настройки. Однако это не сработало.

Наконец, я сделал свое решение:

Просто установите значение случайного ключа, которое вряд ли будет дублировать ключ "имя" при сохранении вашей записи данных. Метод Simple Math '' + Math.random() + Math.random() создает случайную строку.

Ответ 6

У меня была схожая проблема, и что было решено, она понимала, что монго по умолчанию поддерживает только одну схему на коллекцию. Либо сохраните новую схему в другой коллекции, либо удалите существующие документы с несовместимой схемой в вашей текущей коллекции. Или найдите способ иметь более одной схемы для каждой коллекции.

Ответ 7

Это потому, что уже есть коллекция с тем же именем с конфигурацией. Просто удалите сборку с вашего mongodb через оболочку mongo и повторите попытку.

db.collectionName.remove()

теперь запустите приложение, оно должно работать

Ответ 9

У меня возникла такая же проблема, когда у меня была следующая конфигурация в моей конфигурации /models.js

module.exports.models = {
  connection: 'mongodb',
  migrate: 'alter'
}

Изменение переноса с 'alter' на 'safe' исправило это для меня.

module.exports.models = {
  connection: 'mongodb',
  migrate: 'safe'
}

Ответ 10

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

Примечание: сообщение об ошибке приведет вас в этом случае. у него есть путь, который больше не существует. В моем случае старый путь был... $uuid_1 (это индекс!), но новый -.... * priv.uuid_1

Ответ 11

У меня была такая же проблема. Пробовал отлаживать разные способы, не мог понять. Я попытался сбрасывать коллекцию, и после этого она работала нормально. Хотя это нехорошее решение, если в вашей коллекции много документов. Но если вы находитесь в раннем состоянии развития, попробуйте удалить коллекцию.

db.users.drop();

Ответ 12

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

Ответ 13

Очистите коллекцию или удалите всю коллекцию из базы данных MongoDB и повторите попытку позже.