Poniżej znajduje się mój user
schemat w user.js
modelu -
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;
Tak używam go w moim kontrolerze -
var user = require('./../models/user.js');
Tak zapisuję to w 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"});
}
});
Błąd -
{"name":"MongoError","code":11000,"err":"insertDocument :: caused by :: 11000 E11000 duplicate key error index: mydb.users.$email_1 dup key: { : null }"}
Sprawdziłem kolekcję db i nie ma takiego zduplikowanego wpisu, czy mogę powiedzieć, co robię źle?
FYI - req.body.email
i req.body.password
pobieram wartości.
Sprawdziłem również ten post, ale nie pomogłem STACK LINK
Jeśli usunąłem całkowicie, wstawia dokument, w przeciwnym razie zgłasza błąd „Duplikuj” błąd, nawet jeśli mam wpis w local.email
unique: false
nie miało żadnego wpływu. Uświadomiłem sobie, że najpierw muszę upuścić stół, a potem zadziała. Możesz zrobić coś takiegodb.whateverthecollection.drop({})
. Uważaj, usuwa kolekcję.Odpowiedzi:
Komunikat o błędzie mówi, że istnieje już rekord z
null
adresem e-mail. Innymi słowy, masz już użytkownika bez adresu e-mail.Odpowiednia dokumentacja do tego:
unikalne indeksy
Innymi słowy, indeks rzadki jest odpowiedni dla wielu dokumentów
null
wartości.rzadkie indeksy
Z komentarzy:
Twój błąd mówi, że klucz został nazwany,
mydb.users.$email_1
co sprawia, że podejrzewam, że masz indeks na jednousers.email
i drugieusers.local.email
(ten pierwszy jest w tej chwili stary i nieużywany). Usunięcie pola z modelu Mongoose nie wpływa na bazę danych. Sprawdź,mydb.users.getIndexes()
czy tak jest, i ręcznie usuń niechciany indeks za pomocąmydb.users.dropIndex(<name>)
.źródło
mydb.users.$email_1
co sprawia, że podejrzewam, że masz indeks na jednousers.email
i drugieusers.local.email
(ten pierwszy jest w tej chwili stary i nieużywany). Usunięcie pola z modelu Mongoose nie wpływa na bazę danych. Sprawdź,mydb.users.getIndexes()
czy tak jest, i ręcznie usuń niechciany indeks za pomocąmydb.users.dropIndex(<name>)
.db.users.dropIndexes()
jeśli dokonujesz wielu zmian indeksuJeśli nadal jesteś w środowisku programistycznym, upuściłbym całą bazę danych i zacząłbym od nowa z nowym schematem.
Z linii poleceń
źródło
db.collection.dropIndexes()
jak powiedziałSprawdź indeksy kolekcji.
Miałem ten problem z powodu przestarzałych indeksów w kolekcji dla pól, które powinny być przechowywane inną ścieżką.
Mongoose dodaje indeks, gdy określisz pole jako unikalne.
źródło
Zasadniczo ten błąd mówi, że miałeś unikalny indeks w konkretnym polu, na przykład: „email_address”, więc mongodb oczekuje unikalnej wartości adresu e-mail dla każdego dokumentu w kolekcji.
Powiedzmy, że wcześniej w schemacie unikalny indeks nie był zdefiniowany, a następnie zarejestrowałeś 2 użytkowników z tym samym adresem e-mail lub bez adresu e-mail (wartość zerowa).
Później zobaczyłeś, że był błąd. więc spróbuj to poprawić, dodając unikalny indeks do schematu. Ale twoja kolekcja ma już duplikaty, więc komunikat o błędzie mówi, że nie możesz ponownie wstawić zduplikowanej wartości.
Zasadniczo masz trzy opcje:
Upuść kolekcję
db.users.drop();
Znajdź dokument o tej wartości i usuń go. Powiedzmy, że wartość była null, możesz ją usunąć za pomocą:
db.users.remove({ email_address: null });
Upuść unikalny indeks:
db.users.dropIndex(indexName)
Mam nadzieję, że to pomogło :)
źródło
Chcę wyjaśnić odpowiedź / rozwiązanie tego problemu, tak jak wyjaśniam pięciolatkowi, aby każdy mógł zrozumieć.
Mam aplikację. Chcę, aby ludzie rejestrowali się przy użyciu adresu e-mail, hasła i numeru telefonu. W mojej bazie danych MongoDB chcę identyfikować osoby jednoznacznie na podstawie zarówno ich numerów telefonów, jak i wiadomości e-mail - co oznacza, że zarówno numer telefonu, jak i adres e-mail muszą być unikalne dla każdej osoby.
Istnieje jednak problem: zdałem sobie sprawę, że każdy ma numer telefonu, ale nie każdy ma adres e-mail.
Ci, którzy nie mają adresu e-mail, obiecali mi, że będą mieli adres e-mail w przyszłym tygodniu. Ale i tak chcę je zarejestrować - więc mówię im, aby kontynuowali rejestrację swoich numerów telefonicznych, gdy zostawiają puste pole wprowadzania adresu e-mail.
Oni to robią.
Moja baza danych POTRZEBUJE unikalnego pola adresu e-mail - ale mam wiele osób z „null” jako adresem e-mail. Więc idę do mojego kodu i mówię schematowi bazy danych, aby zezwalał na puste / zerowe pola adresów e-mail, które później wypełnię unikatowymi adresami e-mail, gdy osoby, które obiecały dodać swoje e-maile do swoich profili w przyszłym tygodniu.
Więc teraz jest to korzystne dla wszystkich (ale dla ciebie; -]): ludzie się rejestrują, cieszę się, że mam ich dane ... a moja baza danych jest szczęśliwa, ponieważ jest ładnie używana ... ale co z tobą? Mam jeszcze podać kod, który utworzył schemat.
Oto kod: UWAGA: Właściwość rzadka w e-mailu mówi mojej bazie danych, aby zezwoliła na wartości zerowe, które później zostaną wypełnione unikatowymi wartościami.
Mam nadzieję, że dobrze to wytłumaczyłem. Szczęśliwego kodowania / hakowania NodeJS!
źródło
sparse
indeks iunique
sprawdzanie poprawności i masz inne pola, które nie są wymagane, musisz użyć tejpartialFilterExpression
opcji. Zobacz tę odpowiedź stackoverflow.com/a/34600171/728287Miałem do czynienia z podobnymi problemami, po prostu usuwam Indeksy poszczególnych pól, a potem dla mnie działa. https://docs.mongodb.com/v3.2/reference/method/db.collection.dropIndexes/
źródło
W tej sytuacji zaloguj się do Mongo i znajdź indeks, którego już nie używasz (w przypadku OP „e-mail”). Następnie wybierz Drop Index
źródło
Oto moje odradzające doświadczenie:
W schemacie „User” ustawiłem „name” jako unikalny klucz, a następnie uruchomiłem wykonanie, które, jak sądzę, skonfigurowało strukturę bazy danych.
Następnie zmieniłem unikatowy klucz jako „nazwę użytkownika” i nie zapisałem już wartości „nazwa” podczas zapisywania danych w bazie danych. Zatem mongodb może automatycznie ustawić wartość „name” nowego rekordu na null, który jest duplikatem klucza. Próbowałem ustawić klucz „nazwa” jako klucz unikalny
{name: {unique: false, type: String}}
w schemacie „Użytkownik”, aby zastąpić oryginalne ustawienie. Jednak to nie zadziałało.W końcu stworzyłem własne rozwiązanie:
Wystarczy ustawić losową wartość klucza, która prawdopodobnie nie będzie duplikowana do klucza „nazwa” podczas zapisywania rekordu danych. Po prostu metoda matematyczna
'' + Math.random() + Math.random()
tworzy losowy ciąg.źródło
Miałem ten sam problem. Próbowanie debugowania na różne sposoby nie było możliwe. Próbowałem upuścić kolekcję i potem wszystko działało dobrze. Chociaż nie jest to dobre rozwiązanie, jeśli Twoja kolekcja ma wiele dokumentów. Ale jeśli jesteś we wczesnym stadium rozwoju, spróbuj upuścić kolekcję.
źródło
Wynika to z faktu, że istnieje już kolekcja o tej samej nazwie z konfiguracją. Wystarczy usunąć kolekcję z mongodb poprzez powłokę mongo i spróbować ponownie.
teraz uruchom aplikację, powinna działać
źródło
Miałem podobny problem i zdałem sobie sprawę, że domyślnie mongo obsługuje tylko jeden schemat na kolekcję. Zapisz nowy schemat w innej kolekcji lub usuń istniejące dokumenty z niezgodnym schematem w bieżącej kolekcji. Lub znajdź sposób, aby mieć więcej niż jeden schemat na kolekcję.
źródło
Napotkałem również ten problem i go rozwiązałem. Ten błąd pokazuje, że e-mail jest już tutaj obecny. Musisz więc po prostu usunąć tę linię z atrybutu Model dla wiadomości e-mail.
Możliwe, że nawet jeśli to nie zadziała. Wystarczy więc usunąć kolekcję z MongoDB i zrestartować serwer.
źródło
Ten sam problem wystąpił, gdy miałem następującą konfigurację w moim pliku config / models.js
Zmiana migracji z „alter” na „safe” naprawiła to dla mnie.
źródło
ten sam problem po usunięciu właściwości ze schematu po pierwszym zbudowaniu niektórych indeksów podczas zapisywania. usunięcie właściwości ze schematu prowadzi do wartości pustej dla nieistniejącej właściwości, która wciąż miała indeks. Pomaga tutaj upuszczanie indeksu lub rozpoczynanie od nowej kolekcji od podstaw.
Uwaga: w takim przypadku pojawi się komunikat o błędzie. ma ścieżkę, która już nie istnieje. W moim przypadku stara ścieżka to ... $ uuid_1 (to jest indeks!), ale nowa to .... * priv.uuid_1
źródło
Miałem ten sam problem, gdy próbowałem zmodyfikować schemat zdefiniowany za pomocą mangoose. Myślę, że problem jest spowodowany tym, że podczas tworzenia kolekcji wykonano pewne podstawowe procesy, takie jak opisywanie indeksów ukrytych przed użytkownikiem (przynajmniej w moim przypadku). Więc najlepszym rozwiązaniem, jakie znalazłem, było usunięcie całej kolekcji i zacznij od nowa.
źródło
Miałem ten sam problem. Problem polegał na tym, że usunąłem jedno pole z modelu. Kiedy upuściłem db to naprawia
źródło
przyszłym programistom zalecam usunięcie indeksu w INDEX TAB za pomocą kompasu ... NIE USUŃ ŻADNEGO dokumentu w kolekcji Zarządzaj indeksami
źródło
Zmień nazwę kolekcji, jeśli już istnieje w bazie danych, wyświetli błąd. A jeśli podasz dowolną właściwość jako unikalną, wystąpi ten sam błąd.
źródło
Miałem ten sam problem, rozwiązałem go, usuwając plik
unique
atrybut właściwości.Po prostu znajdź inny sposób sprawdzenia poprawności lub sprawdzenia unikalnych wartości właściwości dla swojego schematu.
źródło
Wyczyść kolekcję lub Usuń całą kolekcję z bazy danych MongoDB i spróbuj ponownie później.
źródło