El siguiente es mi user
esquema en el 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;
Así es como lo estoy usando en mi controlador:
var user = require('./../models/user.js');
Así es como lo estoy guardando en la base de datos:
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 }"}
Verifiqué la colección de db y no existe tal entrada duplicada, ¿me avisas qué estoy haciendo mal?
FYI - req.body.email
y req.body.password
están obteniendo valores.
También revisé esta publicación pero no ayudé STACK LINK
Si eliminé completamente, entonces inserta el documento, de lo contrario arroja el error "Duplicar" incluso si tengo una entrada en el correo electrónico local.
unique: false
no estaba teniendo ningún impacto. Me di cuenta de que primero tenía que dejar caer la mesa y luego funcionaría. Puedes hacer algo comodb.whateverthecollection.drop({})
. Tenga cuidado, elimina la colección.Respuestas:
El mensaje de error dice que ya hay un registro con
null
el correo electrónico. En otras palabras, ya tiene un usuario sin una dirección de correo electrónico.La documentación relevante para esto:
índices únicos
En otras palabras, un índice disperso está bien con varios documentos que tienen
null
valores.índices escasos
De comentarios:
Su error dice que se nombra la clave, lo
mydb.users.$email_1
que me hace sospechar que tiene un índice en ambosusers.email
yusers.local.email
(el primero está viejo y sin usar en este momento). Eliminar un campo de un modelo Mongoose no afecta a la base de datos. Compruebemydb.users.getIndexes()
si este es el caso y elimine manualmente el índice no deseado conmydb.users.dropIndex(<name>)
.fuente
mydb.users.$email_1
que me hace sospechar que tiene un índice en ambosusers.email
yusers.local.email
(el primero está viejo y sin usar en este momento). Eliminar un campo de un modelo Mongoose no afecta a la base de datos. Compruebemydb.users.getIndexes()
si este es el caso y elimine manualmente el índice no deseado conmydb.users.dropIndex(<name>)
.db.users.dropIndexes()
Si todavía está en su entorno de desarrollo, dejaría caer toda la base de datos y comenzaría de nuevo con su nuevo esquema.
Desde la línea de comando
fuente
db.collection.dropIndexes()
que dijoVerifique los índices de recolección.
Tuve ese problema debido a los índices obsoletos en la colección de campos, que deberían almacenarse en una nueva ruta diferente.
Mongoose agrega índice, cuando especifica el campo como único.
fuente
Básicamente, este error dice que tenía un índice único en un campo en particular, por ejemplo: "dirección_de_email", por lo que mongodb espera un valor de dirección de correo electrónico único para cada documento de la colección.
Entonces, digamos, anteriormente en su esquema, el índice único no estaba definido, y luego inscribió a 2 usuarios con la misma dirección de correo electrónico o sin dirección de correo electrónico (valor nulo).
Más tarde, viste que hubo un error. entonces intenta corregirlo agregando un índice único al esquema. Pero su colección ya tiene duplicados, por lo que el mensaje de error dice que no puede volver a insertar un valor duplicado.
Básicamente tienes tres opciones:
Suelta la colección
db.users.drop();
Encuentre el documento que tiene ese valor y elimínelo. Digamos que el valor era nulo, puede eliminarlo usando:
db.users.remove({ email_address: null });
Suelte el índice único:
db.users.dropIndex(indexName)
Espero que esto haya ayudado :)
fuente
Quiero explicar la respuesta / solución a esto como se lo estoy explicando a un niño de 5 años, para que todos puedan entender.
Tengo una aplicación. Quiero que las personas se registren con su correo electrónico, contraseña y número de teléfono. En mi base de datos MongoDB, quiero identificar a las personas de manera única en función de sus números de teléfono y correo electrónico, por lo que esto significa que tanto el número de teléfono como el correo electrónico deben ser únicos para cada persona.
Sin embargo, hay un problema: me he dado cuenta de que todos tienen un número de teléfono, pero no todos tienen una dirección de correo electrónico.
Los que no tienen una dirección de correo electrónico me han prometido que tendrán una dirección de correo electrónico la próxima semana. Pero quiero que se registren de todos modos, así que les digo que continúen registrando sus números de teléfono, ya que dejan el campo de entrada de correo electrónico vacío.
Ellos lo hacen
Mi base de datos NECESITA un campo de dirección de correo electrónico único, pero tengo muchas personas con 'nulo' como dirección de correo electrónico. Así que voy a mi código y le digo a mi esquema de base de datos que permita campos de dirección de correo electrónico vacíos / nulos que luego completaré con direcciones únicas de correo electrónico cuando las personas que prometieron agregar sus correos electrónicos a sus perfiles la próxima semana.
Así que ahora es un beneficio mutuo para todos (excepto usted; -)): las personas se registran, estoy feliz de tener sus datos ... y mi base de datos está contenta porque se está usando muy bien ... pero ¿y usted? Todavía tengo que darle el código que hizo el esquema.
Aquí está el código: NOTA: La propiedad dispersa en el correo electrónico es lo que le dice a mi base de datos que permita valores nulos que luego se rellenarán con valores únicos.
Espero haberlo explicado bien. ¡Feliz codificación / pirateo de NodeJS!
fuente
sparse
índice yunique
validación, y tiene otros campos que no son obligatorios, deberá usar lapartialFilterExpression
opción. Ver esta respuesta stackoverflow.com/a/34600171/728287Me enfrenté a problemas similares, solo borro los índices de campos particulares y luego funciona para mí. https://docs.mongodb.com/v3.2/reference/method/db.collection.dropIndexes/
fuente
En esta situación, inicie sesión en Mongo para encontrar el índice que ya no está utilizando (en el caso de OP, 'correo electrónico'). Luego seleccione Drop Index
fuente
Esta es mi experiencia relevante:
En el esquema 'Usuario', configuré 'nombre' como clave única y luego ejecuté algunas ejecuciones, que creo que habían configurado la estructura de la base de datos.
Luego cambié la clave única como 'nombre de usuario' y ya no pasé el valor de 'nombre' cuando guardé datos en la base de datos. Por lo tanto, mongodb puede establecer automáticamente el valor 'nombre' del nuevo registro como nulo, que es una clave duplicada. Intenté establecer la clave '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á con la clave 'nombre' cuando guarde su registro de datos. Simplemente método matemático
'' + Math.random() + Math.random()
hace una cadena aleatoria.fuente
Tuve el mismo problema. Intenté depurar diferentes formas que no podían entender. Intenté 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 está en el estado inicial de desarrollo, intente soltar la colección.
fuente
Esto se debe a que ya hay una colección con el mismo nombre con configuración ... Simplemente elimine la colección de su mongodb a través de mongo shell e intente nuevamente.
ahora ejecuta tu aplicación, debería funcionar
fuente
Tuve un problema similar y me di cuenta de que, por defecto, mongo solo admite un esquema por colección. Almacene 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 manera de tener más de un esquema por colección.
fuente
También me enfrenté a este problema y lo resolví. Este error muestra que el correo electrónico ya está presente aquí. Por lo tanto, solo necesita eliminar esta línea de su Modelo para el atributo de correo electrónico.
Esto podría ser posible incluso si no funciona. Entonces solo necesita eliminar la colección de su MongoDB y reiniciar su servidor.
fuente
Tuve este mismo problema cuando tenía la siguiente configuración en mi config / models.js
Cambiar migrar de 'alterar' a 'seguro' lo arregló para mí.
fuente
mismo problema después de eliminar las propiedades de un esquema después de crear algunos índices al guardar. eliminar la propiedad del esquema conduce a un valor nulo para una propiedad no existente, que todavía tenía un índice. ayuda a eliminar el índice o comenzar con una nueva colección desde cero.
nota: el mensaje de error lo llevará en ese caso. tiene un camino que ya no existe. En mi caso, la ruta anterior era ... $ uuid_1 (¡este es un índice!), pero la nueva es ... * priv.uuid_1
fuente
Tuve el mismo problema cuando intenté modificar el esquema definido con mangoose. Creo que el problema se debe a la razón por la que se realiza 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 descartar toda la colección y empezar de nuevo
fuente
Tuve el mismo problema. El problema fue que eliminé un campo del modelo. Cuando dejé caer db se soluciona
fuente
para futuros desarrolladores, les recomiendo, eliminen el índice en la TABLA DE ÍNDICE usando la brújula ... esto NO BORRARÁ NINGÚN documento en su colección Administrar índices
fuente
Cambie el nombre de la colección si ya existe en la base de datos, mostrará un error. Y si proporcionó alguna propiedad como única, se producirá el mismo error.
fuente
Tuve el mismo problema, lo resolví eliminando el
unique
atributo de la propiedad.Simplemente encuentre otra forma de validar o verificar valores de propiedad únicos para su esquema.
fuente
Borre la colección o elimine toda la colección de la base de datos MongoDB e intente nuevamente más tarde.
fuente