E11000 дубликат ключа индекс ошибки в mongodb Мангуст

следующее 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, и такой дубликат записи не существует, дайте мне знать, что я делаю неправильно ?

к твоему сведению -req.body.email и req.body.password выборки значений.

Я также проверил этот пост, но нет помогите!--23-->ССЫЛКА СТЕКА

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

17 ответов


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

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

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

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

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

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

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

разреженные индексы


из комментариев:

ваша ошибка говорит, что ключ называется mydb.users.$email_1 что заставляет меня подозревать, что у вас есть индекс на оба users.email и users.local.email (бывший старый и неиспользованный в настоящее время). Удаление Поля из модели мангуста не влияет на базу данных. Проверьте с mydb.users.getIndexes() если это так и вручную удалить ненужные индексы с mydb.users.dropIndex(<name>).


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

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

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

проверка индексов коллекции.

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

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


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

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

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

db.users.drop();

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


Это мой опыт соответствующий:

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

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

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

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


Я столкнулся с аналогичными проблемами , Я просто очищаю индексы конкретных полей, а затем его работы для меня . https://docs.mongodb.com/v3.2/reference/method/db.collection.dropIndexes/


Я хочу объяснить ответ/решение этого, как я объясняю 5-летнему ребенку, чтобы каждый мог понять .

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

однако есть проблема : я понял, что все есть номер телефона, но не у всех есть адрес электронной почты .

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

они это делают .

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

Итак, теперь это беспроигрышный для всех (кроме вас ; -]): люди регистрируются, я рад иметь свои данные ...и моя база данных счастлива, потому что она используется красиво ...а как же ты ? Я еще не дал вам код, который создал схему .

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

var userSchema = new mongoose.Schema({
  local: {
    name: { type: String },
    email : { type: String, require: true, index:true, unique:true,sparse: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;

надеюсь, я хорошо объяснил . Счастливое кодирование / взлом NodeJS!


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


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

db.имя_коллекции.удалить()

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


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

db.users.drop();

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

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

изменение миграции с "alter" на "safe" исправлено для меня.

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

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

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


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


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


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


была та же проблема, я решил ее, удалив unique атрибут свойства.

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


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