A mensagem de erro está dizendo que já existe um registro com
null
como o e-mail. Em outras palavras, você já tem um usuário sem endereço de e-mail. A documentação relevante para isso:
Se um documento não tiver um valor para o campo indexado em um índice exclusivo, o índice armazenará um valor nulo para esse documento. Por causa da restrição exclusiva, o MongoDB permitirá apenas um documento que não tenha o campo indexado. Se houver mais de um documento sem um valor para o campo indexado ou estiver faltando o campo indexado, a criação do índice falhará com um erro de chave duplicada.
Você pode combinar a restrição exclusiva com o índice esparso para filtrar esses valores nulos do índice exclusivo e evitar o erro.
índices únicos
Índices esparsos contêm apenas entradas para documentos que possuem o campo indexado, mesmo que o campo de índice contenha um valor nulo.
Em outras palavras, um índice esparso é aceitável com vários documentos com
null
valores. índices esparsos
Dos comentários:
Seu erro diz que a chave se chama
mydb.users.$email_1
o que me faz suspeitar que você tenha um índice em ambos users.email
e users.local.email
(O primeiro sendo antigo e sem uso no momento). A remoção de um campo de um modelo Mongoose não afeta o banco de dados. Verifique com mydb.users.getIndexes()
se este for o caso e remova manualmente o índice indesejado com mydb.users.dropIndex(<name>)
.