it-swarm.com.de

MongoError, err: E11000 Fehler beim Duplikatschlüssel

Ich habe ein MongoDb-Schema wie dieses

    var User = new Schema({
    "UserName": { type: String, required: true },
    "Email": { type: String, required: true, unique: true },
    "UserType": { type: String },
    "Password": { type: String }
});

Ich versuche, einen neuen Benutzer zu erstellenDies geschieht in NodeJs mit mongoose ODM Dies ist der Code zum Erstellen von:

    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' });
                    }
                });
};

Zum Erstellen eines neuen Benutzers gebe ich Attribute und Werte wie folgt:

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

Und ich bekomme Fehler wie folgt:

{"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}}

Ich verstehe, dass dieser Fehler darauf zurückzuführen ist, dass UserName doppelt vorhanden ist, aber Ich habe UserName nicht mit einer eindeutigen Einschränkung festgelegt. Wenn ich eine neue Zeile hinzufüge, brauche ich nur E-Mail, um eindeutig zu sein, UserName kann wiederholt werden ??

25
dany

@ManseUK Stimmt wahrscheinlich, UserName ist ein 'Schlüssel' - in diesem Fall ein Index. Das _id-Attribut ist der "primäre" Index, der standardmäßig erstellt wird, aber mit mongodb können Sie mehrere davon haben.

Starten Sie eine Mongo-Konsole und führen Sie medinfo.users.getIndexes() aus. Etwas muss einen Index für "UserName" hinzugefügt haben.

required: true würde das nicht tun, aber Sie haben zuvor mit anderen Einstellungen gespielt und der Index wurde nicht entfernt.

24
rdrey

Es sollte einen Index geben, der blockiert.

Sie können die Methode db.collection.dropIndex () ausprobieren

medinfo.users.dropIndexes ()

7
Claude COULOMBE

Mir war klar, dass sich meine Datenstrukturen verändert haben - hier kommt versioning zum Tragen.

Möglicherweise müssen Sie ein mongoose-version-Modul erwerben, eine thing.remove({}, ...) ausführen oder sogar die Sammlung löschen: drop database with mongoose

Ich verwende RoboMongo für ein Admin-Tool (und ich kann es nur wärmstens empfehlen!). Ich ging also einfach rein und klickte die Sammlung mit der rechten Maustaste an der Konsole ab.

Wenn jemand weiß, wie man eine Sammlung einfach aus dem Code heraus versionieren und/oder löschen kann, kann man unten einen Kommentar posten, da er diesem Thread (und mir :) sicherlich hilft.

0
Cody

Ich habe ein ähnliches Problem in meinem Projekt bekommen. Ich habe versucht, alle Dokumente zu löschen, und das Dup-Problem taucht immer noch auf. Bis ich diese Sammlung verworfen und meinen Knotendienst neu gestartet habe, hat es einfach funktioniert.

0
wenqing yu