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()
теперь запустите приложение, оно должно работать
Ответ 8
Я столкнулся с подобными проблемами,
Я просто очищаю Индексы определенных полей, тогда его работы для меня.
https://docs.mongodb.com/v3.2/reference/method/db.collection.dropIndexes/
Ответ 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 и повторите попытку позже.