validator uniquevalidator node.js mongodb express mongoose mean-stack

node.js - uniquevalidator - npm mongoose unique validator



Índice de error clave duplicado E11000 en mongodb mangosta (15)

Siguiente es mi esquema de user en el modelo 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;

Así es como lo estoy usando en mi controlador -

var user = require(''./../models/user.js'');

Así es como lo estoy guardando en el 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"}); } });

Error -

{"name":"MongoError","code":11000,"err":"insertDocument :: caused by :: 11000 E11000 duplicate key error index: mydb.users.$email_1 dup key: { : null }"}

Revisé la colección db y no existe esa entrada duplicada, ¿me dejas saber qué estoy haciendo mal?

FYI - req.body.email y req.body.password están req.body.password valores.

También verifiqué esta publicación, pero no ayuda STACK LINK

EDITAR

Si lo eliminé por completo, entonces inserta el documento, de lo contrario arroja el error "Duplicar" incluso cuando tengo una entrada en el correo local.


Borre la colección o elimine la colección completa de la base de datos MongoDB y vuelva a intentarlo más tarde.


El mensaje de error dice que ya hay un registro con null como el correo electrónico. En otras palabras, ya tienes un usuario sin una dirección de correo electrónico.

La documentación relevante para esto:

Si un documento no tiene un valor para el campo indexado en un índice único, el índice almacenará un valor nulo para este documento. Debido a la restricción única, MongoDB solo permitirá un documento que carece del campo indexado. Si hay más de un documento sin un valor para el campo indexado o falta el campo indexado, la compilación del índice fallará con un error de clave duplicado.

Puede combinar la restricción única con el índice disperso para filtrar estos valores nulos del índice exclusivo y evitar el error.

índices únicos

Los índices dispersos solo contienen entradas para documentos que tienen el campo indexado, incluso si el campo de índice contiene un valor nulo.

En otras palabras, un índice disperso está bien con múltiples documentos, todos con valores null .

índices dispersos

De los comentarios:

Su error dice que la clave se llama mydb.users.$email_1 lo que me hace sospechar que tiene un índice en ambos users.email y users.local.email (el primero es viejo y no se users.local.email en este momento). Eliminar un campo de un modelo Mongoose no afecta la base de datos. Verifique con mydb.users.getIndexes() si este es el caso y elimine manualmente el índice no deseado con mydb.users.dropIndex(<name>) .



Esta es mi experiencia relavante:

En el esquema ''Usuario'', configuré ''nombre'' como clave única y luego ejecuté alguna ejecución, que creo que configuró la estructura de la base de datos.

Luego cambié la clave única como ''nombre de usuario'' y ya no pasé el valor ''nombre'' cuando guardé los datos en la base de datos. Entonces, el mongodb puede establecer automáticamente el valor ''nombre'' del nuevo registro como nulo, que es una clave duplicada. Intenté la clave del conjunto ''nombre'' como clave no única {name: {unique: false, type: String}} en el esquema ''Usuario'' para anular la configuración original. Sin embargo, no funcionó.

Por fin, hice mi propia solución:

Simplemente configure un valor de clave aleatorio que probablemente no se duplicará a la tecla ''nombre'' cuando guarde su registro de datos. El método Simply Math '''' + Math.random() + Math.random() una cadena aleatoria.


Esto se debe a que ya hay una colección con el mismo nombre y configuración. Simplemente elimine la colección de su mongodb a través de la consola mongo y vuelva a intentarlo.

db.collectionName.remove ()

Ahora ejecuta tu aplicación, debería funcionar


Esto sucede cuando hay índices de esquema frecuentes y cambios en una base de datos actual y esto se puede solucionar fácilmente eliminando los índices del sistema y toda la colección.

Funciona después de hacer eso, esto también sucede cuando no hay una clave única para separar dos documentos entre sí.

Si estás usando un shell, puedes soltar el db vía -

db.users.drop();

Espero que esto haya ayudado :)


Obtuve el mismo problema cuando tenía la siguiente configuración en mi config / models.js

module.exports.models = { connection: ''mongodb'', migrate: ''alter'' }

Cambiar la migración de ''alterar'' a ''seguro'' lo solucionó.

module.exports.models = { connection: ''mongodb'', migrate: ''safe'' }


Si todavía está en su entorno de desarrollo, dejaría caer todo el DB y comenzaría de nuevo con su nuevo esquema.

Desde la línea de comando

➜ mongo use dbName; db.dropDatabase(); exit


Tuve el mismo problema cuando traté de modificar el esquema definido usando mangoose. Creo que el problema se debe a la razón por la cual hay un proceso subyacente al crear una colección como describir los índices que están ocultos para el usuario (al menos en mi caso). Así que la mejor solución que encontré fue dejar caer toda la colección y comienza de nuevo.


Tuve el mismo problema que resolví al eliminar el atributo unique en la propiedad.

Simplemente encuentre otra forma de validar o verificar valores de propiedad únicos para su esquema.


Tuve el mismo problema. El problema fue que eliminé un campo del modelo. Cuando dejé db, corrigió


Tuve el mismo problema. Probé la depuración de diferentes maneras que no pude descubrir. Traté de dejar caer la colección y funcionó bien después de eso. Aunque esta no es una buena solución si su colección tiene muchos documentos. Pero si se encuentra en el estado inicial de desarrollo intente abandonar la colección.

db.users.drop();


Tuve un problema similar y lo que lo resolvió fue darse cuenta de que mongo por defecto solo admite un esquema por colección. Guarde su nuevo esquema en una colección diferente o elimine los documentos existentes con el esquema incompatible dentro de su colección actual. O encuentre una forma de tener más de un esquema por colección.


Verifique los índices de colección.

Tuve ese problema debido a los índices desactualizados en la colección de campos, que deberían almacenarse por una nueva ruta diferente.

Mongoose agrega índice, cuando especifica el campo como único.


mismo problema después de eliminar propiedades de un esquema después de crear primero algunos índices para guardar. eliminar propiedad del esquema lleva a un valor nulo para una propiedad no existente, que aún tenía un índice. soltar índice o comenzar con una nueva colección desde cero ayuda aquí.

nota: el mensaje de error lo llevará en ese caso. tiene un camino, eso ya no existe. en mi caso, el antiguo camino era ... $ uuid_1 (¡este es un índice!), pero el nuevo es ... * priv.uuid_1