MongoError, err: e11000 erreur de clé en double
J'ai un schéma MongoDb comme ceci
var User = new Schema({
"UserName": { type: String, required: true },
"Email": { type: String, required: true, unique: true },
"UserType": { type: String },
"Password": { type: String }
});
J'essaie de créer un nouvel utilisateur Ceci est fait dans NodeJs en utilisant mongoose ODM Et c'est le code pour créer:
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' });
}
});
};
Le pour créer un nouvel utilisateur, je donne des attributs et des valeurs comme suit:
{
"UserName": "ann",
"Email": "ann@ann.com",
"UserType": "normaluser",
"Password":"123456"
}
Et je reçois une erreur comme ceci:
{"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}}
Je comprends que cette erreur est due au fait que le nom D'utilisateur est dupliqué, mais Je n'ai pas défini le nom D'utilisateur avec une contrainte unique.Chaque fois que j'ajoute une nouvelle ligne, je besoin seulement email pour être unique, Nom D'utilisateur peut être répété .Comment atteindre cet objectif??
4 réponses
@ManseUK a probablement raison, cela ressemble à UserName est une ' clé ' - dans ce cas un index. L'attribut _id
est l'index "principal" créé par défaut, mais mongodb vous permet d'en avoir plusieurs.
Démarrez une console mongo et exécutez medinfo.users.getIndexes()
? Quelque chose doit avoir ajouté un index sur 'UserName'.
required: true
ne le ferait pas, mais vous avez peut-être joué avec d'autres paramètres précédemment et l'index n'a pas été supprimé?
Il devrait y avoir un index qui bloque.
Vous pouvez essayer la base de données.collection.méthode dropIndex ()
Medinfo.utilisateur.dropIndexes ()
Ce que j'avais réalisé, c'est que mes structures de données changeaient-c'est là que versioning
est utile.
Vous devrez peut-être obtenir un module mongoose-version
, Faire un thing.remove({}, ...)
ou même déposer la collection: déposer la base de données avec mongoose
J'utilise RoboMongo pour un outil d'administration (et je le recommande fortement!) donc, je suis juste entré et j'ai cliqué avec le bouton droit de la souris / supprimé la collection de la console.
Si quelqu'un sait comment facilement version et / ou déposer une collection à partir du code, n'hésitez pas à poster un commentaire ci-dessous car cela aide sûrement ce fil (et moi :)).
J'ai eu le problème similaire sur mon projet. J'ai essayé d'effacer tous les documents et le problème dup continue à apparaître. Jusqu'à ce que je laisse tomber cette collection et redémarre mon service de nœud, cela a juste fonctionné.