javascript - tutorial - mongoose update
MongoError, err: error de clave duplicada E11000 (4)
@ManseUK Probablemente tenga razón, parece que UserName es una ''clave'', en este caso un índice. El atributo _id
es el índice "primario" que se crea de manera predeterminada, pero mongodb le permite tener múltiples de estos.
Inicie una consola mongo y ejecute medinfo.users.getIndexes()
? Algo debe haber agregado un índice en ''UserName''.
required: true
no haría eso, pero es posible que haya jugado con otras configuraciones anteriormente y que el índice no se haya eliminado.
Tengo un esquema de MongoDb como este
var User = new Schema({
"UserName": { type: String, required: true },
"Email": { type: String, required: true, unique: true },
"UserType": { type: String },
"Password": { type: String }
});
Intento crear un nuevo usuario Esto se hace en NodeJs usando mongoose ODM Y este es el código para crear:
controller.createUser = function (req, res) {
var user = new models.User({
"UserName": req.body.UserName.toLowerCase(),
"Email": req.body.Email.toLowerCase(),
"UserType": req.body.UserType.toLowerCase()
});
models.User.findOne({ ''Email'': user.Email }, function (err, olduser) {
if (!err) {
if (olduser) {
res.send({ ''statusCode'': 409, ''statusText'': ''Email Already Exists'' });
}
else if (!olduser) {
user.setPassword(req.body.Password);
user.save(function (err, done) {
if (!err) {
console.log(user);
res.send({ ''statusCode'': 201, ''statusText'': ''CREATED'' });
}
else {
res.send({ ''Status code'': 500, ''statusText'': ''Internal Server Error'' });
}
});
}
}
else {
res.send({ ''statusCode'': 500, ''statusText'': ''ERROR'' });
}
});
};
Para crear un nuevo usuario, estoy dando atributos y valores de la siguiente manera:
{
"UserName": "ann",
"Email": "[email protected]",
"UserType": "normaluser",
"Password":"123456"
}
Y recibo un error como este:
{"Status code":500,"statusText":"Internal Server Error","Error":{"name":"MongoError","err":"E11000 duplicate key error index: medinfo.users.$UserName_1 dup key: { : /"ann/" }","code":11000,"n":0,"connectionId":54,"ok":1}}
Entiendo que este error se debe a que UserName está duplicado, pero no he configurado UserName con restricción única. Cada vez que agrego una nueva fila, solo necesito que el correo sea único, UserName puede repetirse. ¿ Cómo lograr esto?
Debería haber un índice que está bloqueando.
Puede probar el método db.collection.dropIndex ()
medinfo.users.dropIndexes ()
Lo que me di cuenta es que mis estructuras de datos estaban cambiando, aquí es donde el versioning
es útil.
Es posible que necesite obtener un módulo de mongoose-version
, hacer una thing.remove({}, ...)
o incluso descartar la colección: soltar la base de datos con mangosta
Utilizo RoboMongo para una herramienta de administración (¡y lo recomiendo!), Así que simplemente entré y seleccioné el botón derecho / dejé la colección desde la consola.
Si alguien sabe cómo versionar y / o eliminar fácilmente una colección desde el código, no dude en publicar un comentario a continuación, ya que seguramente ayuda a este hilo (y yo :)).
Tengo el problema similar en mi proyecto. Traté de borrar todos los documentos y el problema del dup aún sigue apareciendo. Hasta que eliminé esta colección y reinicié mi servicio de nodo, simplemente funcionó.