Следующее - моя 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');
Вот как я сохраняю это в БД -
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 }"}
Я проверил коллекцию БД и такой дублированной записи не существует, дайте мне знать, что я делаю неправильно?
К вашему сведению - req.body.email
и req.body.password
выбираем значения.
Я также проверил этот пост, но без помощи STACK LINK
Если я удалил полностью, то вставляет документ, в противном случае выдает ошибку «Дублировать», даже если у меня есть запись в local.email
unique: false
не оказала никакого влияния. Я понял, что сначала должен уронить стол, а потом все заработает. Вы можете сделать что-то вродеdb.whateverthecollection.drop({})
. Будьте осторожны, он удаляет коллекцию.Ответы:
В сообщении об ошибке говорится, что в качестве
null
электронного письма уже есть запись . Другими словами, у вас уже есть пользователь без адреса электронной почты.Соответствующая документация для этого:
уникальные индексы
Другими словами, разреженный индекс подходит для нескольких документов, каждый из которых имеет
null
значения.разреженные индексы
Из комментариев:
Ваша ошибка говорит о том, что ключ назван,
mydb.users.$email_1
что заставляет меня подозревать, что у вас есть индекс для обоихusers.email
иusers.local.email
(первый является старым и не использованным в данный момент). Удаление поля из модели Mongoose не влияет на базу данных. Проверьте,mydb.users.getIndexes()
если это так, и вручную удалите нежелательный индекс с помощьюmydb.users.dropIndex(<name>)
.источник
mydb.users.$email_1
что заставляет меня подозревать, что у вас есть индекс для обоихusers.email
иusers.local.email
(первый является старым и не использованным в данный момент). Удаление поля из модели Mongoose не влияет на базу данных. Проверьте,mydb.users.getIndexes()
если это так, и вручную удалите нежелательный индекс с помощьюmydb.users.dropIndex(<name>)
.db.users.dropIndexes()
если вы делаете несколько изменений индексаЕсли вы все еще находитесь в своей среде разработки, я бы отбросил всю базу данных и начал бы заново с вашей новой схемой.
Из командной строки
источник
db.collection.dropIndexes()
как сказалПроверьте коллекционные индексы.
У меня была эта проблема из-за устаревших индексов в коллекции для полей, которые должны храниться по другому новому пути.
Mongoose добавляет индекс, когда вы указываете поле как уникальное.
источник
В общем, эта ошибка говорит о том, что у вас есть уникальный индекс для определенного поля, например: «email_address», поэтому mongodb ожидает уникальное значение адреса электронной почты для каждого документа в коллекции.
Допустим, ранее в вашей схеме уникальный индекс не был определен, а затем вы зарегистрировали 2 пользователей с одинаковым адресом электронной почты или без адреса электронной почты (нулевое значение).
Позже вы увидели, что произошла ошибка. поэтому вы пытаетесь исправить это, добавив в схему уникальный индекс. Но в вашей коллекции уже есть дубликаты, поэтому в сообщении об ошибке говорится, что вы не можете вставить повторяющееся значение снова.
По сути, у вас есть три варианта:
Оставьте коллекцию
db.users.drop();
Найдите документ, который имеет это значение, и удалите его. Допустим, значение было нулевым, вы можете удалить его, используя:
db.users.remove({ email_address: null });
Оставьте уникальный индекс:
db.users.dropIndex(indexName)
Надеюсь, это помогло :)
источник
Я хочу объяснить ответ / решение этого, как я объясняю 5-летнему ребенку, чтобы все могли понять.
У меня есть приложение. Я хочу, чтобы люди регистрировались по электронной почте, паролю и номеру телефона. В моей базе данных MongoDB я хочу однозначно идентифицировать людей по их телефонным номерам и электронной почте, так что это означает, что как телефонный номер, так и адрес электронной почты должны быть уникальными для каждого человека.
Однако есть проблема: я понял, что у каждого есть номер телефона, но не у каждого есть адрес электронной почты.
Те, у кого нет адреса электронной почты, пообещали мне, что у них будет адрес электронной почты к следующей неделе. Но я все равно хочу, чтобы они были зарегистрированы - поэтому я говорю им, чтобы они продолжали регистрировать свои номера телефонов, оставляя поле ввода электронной почты пустым.
Они так и делают.
Моя база данных нуждается в уникальном поле адреса электронной почты - но у меня есть много людей с нулевым адресом в качестве адреса электронной почты. Поэтому я перехожу к своему коду и говорю своей схеме базы данных разрешить пустые / пустые поля адресов электронной почты, которые я позже заполню уникальными адресами электронной почты, когда люди, которые пообещали добавить свои электронные письма в свои профили на следующей неделе.
Так что теперь это беспроигрышный вариант для всех (кроме вас; -]): люди регистрируются, я рад получить их данные ... и моя база данных довольна, потому что она хорошо используется ... но как насчет вас? Я еще не дал вам код, который создал схему.
Вот код: ПРИМЕЧАНИЕ. Свойство sparse в электронной почте сообщает моей базе данных о разрешенных пустых значениях, которые впоследствии будут заполнены уникальными значениями.
Надеюсь, я хорошо это объяснил. Счастливого NodeJS кодирования / взлома!
источник
sparse
индекс иunique
проверка, а также есть другие поля, которые не требуются, вам нужно использовать этуpartialFilterExpression
опцию. Смотрите этот ответ stackoverflow.com/a/34600171/728287Я сталкивался с подобными проблемами, я просто очищаю индексы определенных полей, тогда это работает для меня. https://docs.mongodb.com/v3.2/reference/method/db.collection.dropIndexes/
источник
В этой ситуации войдите в Mongo и найдите индекс, который вы больше не используете (в случае OP 'email'). Затем выберите Drop Index
источник
Это мой соответствующий опыт:
В схеме «Пользователь» я установил «имя» в качестве уникального ключа, а затем выполнил некоторое выполнение, которое, я думаю, настроило структуру базы данных.
Затем я изменил уникальный ключ как «имя пользователя» и больше не передавал значение «имя» при сохранении данных в базе данных. Таким образом, mongodb может автоматически установить значение 'name' для новой записи как null, что является дубликатом ключа. Я попытался установить ключ 'name' как не уникальный ключ
{name: {unique: false, type: String}}
в схеме 'User', чтобы переопределить исходную настройку. Однако это не сработало.Наконец, я сделал свое собственное решение:
Просто установите случайное значение ключа, которое вряд ли будет дублировать ключ «имя» при сохранении записи данных. Просто метод Math
'' + Math.random() + Math.random()
создает случайную строку.источник
Я была такая же проблема. Попытки отладки разными способами не могли понять. Я попытался сбросить коллекцию, и после этого она работала нормально. Хотя это не очень хорошее решение, если в вашей коллекции много документов. Но если вы находитесь на ранней стадии разработки, попробуйте сбросить коллекцию.
источник
Это потому, что уже существует коллекция с таким же именем и конфигурацией. Просто удалите коллекцию из вашего mongodb через оболочку mongo и попробуйте снова.
теперь запустите ваше приложение, оно должно работать
источник
У меня была похожая проблема, и я понял, что по умолчанию Mongo поддерживает только одну схему на коллекцию. Либо сохраните новую схему в другой коллекции, либо удалите существующие документы с несовместимой схемой в вашей текущей коллекции. Или найдите способ иметь более одной схемы на коллекцию.
источник
Я тоже столкнулся с этой проблемой и решил ее. Эта ошибка показывает, что электронная почта уже присутствует здесь. Так что вам просто нужно удалить эту строку из вашей модели для атрибута электронной почты.
Это может быть возможно, даже если это не сработает. Так что просто нужно удалить коллекцию из MongoDB и перезагрузить сервер.
источник
Я получил эту же проблему, когда у меня была следующая конфигурация в моем config / models.js
Изменение перехода от 'alter' к 'safe' исправило это для меня.
источник
та же проблема после удаления свойств из схемы после создания некоторых индексов при сохранении. удаление свойства из схемы приводит к нулевому значению для несуществующего свойства, у которого все еще был индекс. здесь помогает удаление индекса или начало с новой коллекции с нуля.
примечание: сообщение об ошибке приведет вас в этом случае. у него есть путь, которого больше нет. В моем случае старый путь был ... $ uuid_1 (это индекс!), но новый - .... * priv.uuid_1
источник
У меня была та же проблема, когда я пытался изменить схему, определенную с помощью mangoose. Я думаю, что проблема связана с тем, что при создании коллекции был сделан какой-то базовый процесс, такой как описание индексов, которые скрыты от пользователя (по крайней мере, в моем случае). Так что лучшее решение, которое я нашел, это удалить всю коллекцию и начать снова.
источник
У меня была такая же проблема. Проблема заключалась в том, что я удалил одно поле из модели. Когда я уронил дБ это исправляет
источник
для будущих разработчиков, я рекомендую удалить индекс в INDEX TAB с помощью компаса ... это НЕ УДАЛИТЬ ЛЮБОЙ документ в вашей коллекции. Управление индексами
источник
Измените имя коллекции, если оно уже существует в базе данных, будет отображаться ошибка. И если вы указали какое-либо свойство как уникальное, произойдет та же ошибка.
источник
У меня была та же проблема, которую я решил, удалив
unique
атрибут в свойстве.Просто найдите другой способ проверки или проверки уникальных значений свойств для вашей схемы.
источник
Очистите коллекцию или удалите всю коллекцию из базы данных MongoDB и повторите попытку позже.
источник