web-dev-qa-db-fra.com

MongoError, err: erreur de clé dupliquée E11000

J'ai un schéma MongoDb comme celui-ci

    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 utilisateurCeci est fait dans NodeJs en utilisant mongoose ODM Et voici 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' });
                    }
                });
};

Pour créer un nouvel utilisateur, je donne les attributs et les valeurs comme suit:

 {
"UserName": "ann",
"Email": "[email protected]",
"UserType": "normaluser",
"Password":"123456"
}

Et je reçois une erreur comme celle-ci:

{"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 UserName est dupliqué, mais Je n’ai pas défini UserName avec une contrainte unique. Chaque fois que j’ajoute une nouvelle ligne, il suffit que le courrier électronique soit unique pour pouvoir être répété . ??

25
dany

@ManseUK Est probablement vrai, cela ressemble à UserName est une «clé» - dans ce cas un index. L'attribut _id est l'index "primaire" créé par défaut, mais mongodb vous permet d'en avoir plusieurs.

Démarrer une console Mongo et lancer medinfo.users.getIndexes()? Quelque chose doit avoir ajouté un index sur 'UserName'.

required: true ne ferait pas cela, mais vous avez peut-être déjà joué avec d'autres paramètres et l'index n'a pas été supprimé?

24
rdrey

Il devrait y avoir un index qui bloque.

Vous pouvez essayer la méthode db.collection.dropIndex ()

medinfo.users.dropIndexes ()

7
Claude COULOMBE

Ce que j’ai compris, c’est que mes structures de données étaient en train de changer - c’est là que versioning est utile.

Vous devrez peut-être obtenir un module mongoose-version, effectuer une thing.remove({}, ...) ou même supprimer la collection: drop database with mongoose

J'utilise RoboMongo pour un outil d'administration (et je le recommande vivement!). Je suis donc entré et j'ai cliqué avec le bouton droit/supprimé la collecte de la console.

Si quelqu'un sait comment mettre à jour et/ou supprimer facilement une collection à l'intérieur du code, n'hésitez pas à poster un commentaire ci-dessous, car cela aide sûrement ce fil (et moi :)).

0
Cody

J'ai eu le même problème avec mon projet. J'ai essayé de nettoyer tous les documents et la question de la dup continue de surgir. Jusqu'à ce que j'aie abandonné cette collection et redémarré mon service de nœud, cela fonctionnait.

0
wenqing yu