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; 

Вот как я использую его в своем controllerе –

 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

17 Solutions collect form web for “E11000 дублирует ключевой индекс ошибки в mongodb mongoose”

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

 db.users.drop(); 

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

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

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

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

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

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

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

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

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

db.collectionName.remove ()

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

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

 db.users.drop(); 

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

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

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

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

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

Моя firebase database НЕОБХОДИМА уникальное поле адреса электронной почты, но у меня есть много людей с нулевым именем в качестве адреса электронной почты. Поэтому я перехожу к своему коду и передаю схему моей базы данных, чтобы разрешить поля пустых / нулевых адресов электронной почты, которые я позже заполню уникальными адресами электронной почты, когда люди, которые пообещали добавить свои письма к своим профилям на следующей неделе.

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

Вот код: ПРИМЕЧАНИЕ. Редкое свойство в электронной почте – это то, что сообщает моей базе данных о допустимых значениях, которые позже будут заполнены уникальными значениями.

 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; 

Я получил эту же проблему, когда у меня была следующая конфигурация в моей конфигурации / models.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 и повторите попытку позже.

  • try / catch блоки с async / wait
  • Array.push () делает все элементы одинаковыми при нажатии объекта
  • Что такое хороший магазин сеансов для одноразового приложения Node.js?
  • Node.js - Использование async lib - async.foreach с объектом
  • Использование Node.js только против использования Node.js с Apache / Nginx
  • Model.find (). ToArray () утверждает, что не имеет метода .toArray ()
  • Как закрыть читаемый stream (до конца)?
  • Использовать переменную в Jade include
  • node.js - простые HTTP-запросы с сжатием gzip / deflate
  • Почему цикл while блокирует цикл событий?
  • Как настроить несколько поддоменов в Express.js или Connect.js
  • Interesting Posts

    Есть ли способ отключить поведение «верхнего левого клика в приложении метро» в Windows 8?

    Как я могу сначала сделать «ls» show dotfiles?

    MS Access: как скомпилировать текущую базу данных в VBA

    Получение MathJax для обновления после изменений в модели AngularJS

    Firefox, который отслеживает время загрузки веб-страницы, включая время восстановления DNS?

    Переменная среды, используемая CMake для обнаружения инструментов компилятора Visual C ++ для Ninja

    maxlength атрибута текстового поля из DataAnnotations StringLength в Asp.Net MVC

    Почему безопаснее использовать sizeof (* указатель) в malloc

    Почему обновления Windows 7 так долго устанавливаются?

    Не удается подключиться к определенным сайтам

    Преобразование веб-страницы в изображение из ASP.NET

    Как изменить файлы конфигурации .NET во время установки?

    В каких случаях лучше использовать безусловный AND (& вместо &&)

    C # Проверка ввода текстового поля на winforms

    Создание символа Юникода из его номера

    Давайте будем гением компьютера.