A seguir está meu user
esquema no user.js
modelo -
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;
É assim que eu estou usando no meu controlador -
var user = require('./../models/user.js');
É assim que eu estou salvando no 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"});
}
});
Erro -
{"name":"MongoError","code":11000,"err":"insertDocument :: caused by :: 11000 E11000 duplicate key error index: mydb.users.$email_1 dup key: { : null }"}
Eu verifiquei a coleção db e não existe essa entrada duplicada, deixe-me saber o que estou fazendo de errado?
FYI - req.body.email
e req.body.password
estão buscando valores.
Eu também verifiquei este post, mas não ajuda STACK LINK
Se eu removi completamente, em seguida, ele insere o documento, caso contrário, gera o erro "Duplicar", mesmo que eu tenha uma entrada no local.email
unique: false
não estava tendo nenhum impacto. Percebi que tinha que primeiro largar a mesa e depois funcionaria. Você pode fazer algo parecidodb.whateverthecollection.drop({})
. Cuidado, ele exclui a coleção.Respostas:
A mensagem de erro está dizendo que já existe um registro
null
como email. Em outras palavras, você já tem um usuário sem um endereço de email.A documentação relevante para isso:
índices únicos
Em outras palavras, um índice esparso é aceitável com vários documentos, todos com
null
valores.índices esparsos
Dos comentários:
Seu erro diz que a chave é nomeada, o
mydb.users.$email_1
que me faz suspeitar que você tenha um índice em ambosusers.email
eusers.local.email
(o primeiro está velho e não é usado no momento). A remoção de um campo de um modelo do Mongoose não afeta o banco de dados. Verifiquemydb.users.getIndexes()
se esse é o caso e remova manualmente o índice indesejado commydb.users.dropIndex(<name>)
.fonte
mydb.users.$email_1
que me faz suspeitar que você tenha um índice em ambosusers.email
eusers.local.email
(o primeiro está velho e não é usado no momento). A remoção de um campo de um modelo do Mongoose não afeta o banco de dados. Verifiquemydb.users.getIndexes()
se esse é o caso e remova manualmente o índice indesejado commydb.users.dropIndex(<name>)
.db.users.dropIndexes()
se você estiver fazendo várias alterações de índiceSe você ainda estiver em seu ambiente de desenvolvimento, eu descartaria o banco de dados inteiro e começaria novamente com seu novo esquema.
Na linha de comando
fonte
db.collection.dropIndexes()
a cs_stackX disseVerifique os índices de coleção.
Eu tive esse problema devido a índices desatualizados na coleção de campos, que devem ser armazenados por um novo caminho diferente.
O Mongoose adiciona índice quando você especifica o campo como exclusivo.
fonte
Bem, basicamente, este erro está dizendo, que você tinha um índice exclusivo em um campo específico, por exemplo: "email_address", então o mongodb espera um valor exclusivo de endereço de email para cada documento da coleção.
Por exemplo, no seu esquema, o índice exclusivo não foi definido e, em seguida, você inscreveu 2 usuários com o mesmo endereço de email ou sem endereço de email (valor nulo).
Mais tarde, você viu que houve um erro. então você tenta corrigi-lo adicionando um índice exclusivo ao esquema. Como sua coleção já possui duplicatas, a mensagem de erro informa que você não pode inserir um valor duplicado novamente.
Você tem essencialmente três opções:
Descartar a coleção
db.users.drop();
Encontre o documento que possui esse valor e exclua-o. Digamos que o valor fosse nulo, você pode excluí-lo usando:
db.users.remove({ email_address: null });
Solte o índice exclusivo:
db.users.dropIndex(indexName)
Espero que isso tenha ajudado :)
fonte
Quero explicar a resposta / solução para isso, como estou explicando a uma criança de 5 anos, para que todos possam entender.
Quero que as pessoas se registrem com seu e-mail, senha e número de telefone. No meu banco de dados do MongoDB, quero identificar pessoas exclusivamente com base em seus números de telefone e email - portanto, isso significa que tanto o número de telefone quanto o email devem ser exclusivos para cada pessoa.
No entanto, há um problema: percebi que todo mundo tem um número de telefone, mas nem todo mundo tem um endereço de email.
Aqueles que não têm um endereço de e-mail me prometeram que terão um endereço de e-mail até a próxima semana. Mas eu quero que eles sejam registrados de qualquer maneira - então eu digo para eles continuarem registrando seus números de telefone enquanto deixam o campo de entrada de email vazio.
Eles fazem isso.
Meu banco de dados PRECISA de um campo de endereço de email exclusivo - mas eu tenho muitas pessoas com 'null' como endereço de email. Então, vou ao meu código e digo ao esquema do banco de dados para permitir campos de endereço de email vazios / nulos que posteriormente preencherei com endereços exclusivos de email quando as pessoas que prometeram adicionar seus emails a seus perfis na próxima semana.
Portanto, agora é uma vantagem para todos (exceto você; -]): as pessoas se registram, fico feliz por ter seus dados ... e meu banco de dados está feliz porque está sendo usado com bom gosto ... mas e você? Ainda estou para fornecer o código que criou o esquema.
Aqui está o código: NOTA: A propriedade esparsa no email é o que diz ao meu banco de dados para permitir valores nulos que posteriormente serão preenchidos com valores exclusivos.
Espero ter explicado bem. Feliz NodeJS codificação / hacking!
fonte
sparse
índice eunique
validação e possui outros campos que não são necessários, precisará usar apartialFilterExpression
opção Veja esta resposta stackoverflow.com/a/34600171/728287Enfrentei problemas semelhantes. Acabei de limpar os índices de campos específicos e, em seguida, funciona para mim. https://docs.mongodb.com/v3.2/reference/method/db.collection.dropIndexes/
fonte
Nessa situação, faça logon no Mongo e encontre o índice que você não está mais usando (no caso do OP 'email'). Em seguida, selecione Drop Index
fonte
Esta é a minha experiência relevante:
No esquema 'Usuário', defino 'nome' como chave exclusiva e, em seguida, executei alguma execução, que acho que configurou a estrutura do banco de dados.
Alterei a chave exclusiva como 'nome de usuário' e não passei mais o valor 'nome' quando salvei os dados no banco de dados. Portanto, o mongodb pode definir automaticamente o valor 'nome' do novo registro como nulo, que é uma chave duplicada. Tentei a chave 'nome' definida como chave não exclusiva
{name: {unique: false, type: String}}
no esquema 'Usuário' para substituir a configuração original. No entanto, não funcionou.Por fim, fiz minha própria solução:
Basta definir um valor de chave aleatória que provavelmente não será duplicado para a chave 'name' quando você salvar seu registro de dados. O método Simply Math
'' + Math.random() + Math.random()
cria uma sequência aleatória.fonte
Eu tive o mesmo problema. Tentei depurar maneiras diferentes não consegui descobrir. Tentei largar a coleção e funcionou bem depois disso. Embora essa não seja uma boa solução, se sua coleção tiver muitos documentos. Mas se você estiver no estado inicial de desenvolvimento, tente descartar a coleção.
fonte
Isso ocorre porque já existe uma coleção com o mesmo nome na configuração .. Basta remover a coleção do seu mongodb através do shell do mongo e tente novamente.
agora execute seu aplicativo, ele deve funcionar
fonte
Eu tive um problema semelhante e percebi que, por padrão, o mongo suporta apenas um esquema por coleção. Armazene seu novo esquema em uma coleção diferente ou exclua os documentos existentes com o esquema incompatível na sua coleção atual. Ou encontre uma maneira de ter mais de um esquema por coleção.
fonte
Eu também enfrentei esse problema e resolvi-o. Este erro mostra que o email já está presente aqui. Então, você só precisa remover esta linha do seu atributo Model for email.
Pode ser possível que, mesmo que não funcione. Então, basta excluir a coleção do seu MongoDB e reiniciar o servidor.
fonte
Eu tive esse mesmo problema quando tive a seguinte configuração em meu config / models.js
Alterar a migração de 'alter' para 'safe' corrigiu isso para mim.
fonte
mesmo problema após remover as propriedades de um esquema após criar primeiro alguns índices ao salvar. remover a propriedade do esquema leva a um valor nulo para uma propriedade não existente, que ainda tinha um índice. soltar o índice ou começar com uma nova coleção do zero ajuda aqui.
nota: a mensagem de erro levará você nesse caso. tem um caminho que não existe mais. No meu caso, o caminho antigo era ... $ uuid_1 (este é um índice!), mas o novo é .... * priv.uuid_1
fonte
Eu tive o mesmo problema quando tentei modificar o esquema definido usando mangoose. Penso que o problema se deve ao motivo de haver algum processo subjacente ao criar uma coleção, como descrever os índices ocultos do usuário (pelo menos no meu caso) .Então, a melhor solução encontrada foi descartar a coleção inteira e comece de novo.
fonte
Eu tive o mesmo problema. O problema foi que removi um campo do modelo. Quando eu larguei db ele corrige
fonte
para futuros desenvolvedores, eu recomendo, exclua o índice na INDEX TAB usando a bússola ... isso NÃO EXCLUI QUALQUER documento em sua coleção Gerenciar índices
fonte
Altere o nome da coleção, se ele já existir no banco de dados, ele mostrará um erro. E se você forneceu alguma propriedade como única, o mesmo erro ocorrerá.
fonte
Teve o mesmo problema que eu resolvi removendo o
unique
atributo na propriedade.Basta encontrar outra maneira de validar ou verificar valores de propriedades exclusivos para seu esquema.
fonte
Limpe a coleção ou Exclua a coleção inteira do banco de dados MongoDB e tente novamente mais tarde.
fonte