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??

23
demandé sur dany 2012-11-19 16:49:21

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é?

23
répondu rdrey 2012-11-19 13:27:03

Il devrait y avoir un index qui bloque.

Vous pouvez essayer la base de données.collection.méthode dropIndex ()

Medinfo.utilisateur.dropIndexes ()

6
répondu Claude COULOMBE 2014-07-12 04:58:23

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 :)).

0
répondu Cody 2017-05-23 11:46:17

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é.

0
répondu wenqing yu 2016-09-08 06:50:20