Komunikat o błędzie mówi, że istnieje już rekord z null
jako e-mail. Innymi słowy, masz już użytkownika bez adresu e-mail.
Odpowiednia dokumentacja do tego:
Jeśli dokument nie ma wartości dla indeksowanego pola w unikalnym indeksie, indeks będzie przechowywać wartość null dla tego dokumentu. Ze względu na unikatowe ograniczenie MongoDB zezwoli tylko na jeden dokument, który nie ma indeksowanego pola. Jeśli istnieje więcej niż jeden dokument bez wartości dla indeksowanego pola lub brakuje indeksowanego pola, budowanie indeksu nie powiedzie się z powodu błędu zduplikowanego klucza.
Możesz połączyć ograniczenie przez unikalność z indeksem rzadkim, aby odfiltrować te wartości null z unikalnego indeksu i uniknąć błędu.
unikalne indeksy
Indeksy rzadkie zawierają tylko wpisy dla dokumentów, które mają indeksowane pole, nawet jeśli pole indeksu zawiera wartość pustą.
Innymi słowy, rzadki indeks jest w porządku, gdy wiele dokumentów ma null
wartości.
rzadkie indeksy
Z komentarzy:
Twój błąd mówi, że klucz ma nazwę mydb.users.$email_1
co sprawia, że podejrzewam, że masz indeks na obu users.email
i users.local.email
(Pierwszy jest obecnie stary i nieużywany). Usunięcie pola z modelu Mongoose nie wpływa na bazę danych. Sprawdź za pomocą mydb.users.getIndexes()
w takim przypadku i ręcznie usuń niechciany indeks za pomocą mydb.users.dropIndex(<name>)
.