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 ??
@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.
Es sollte einen Index geben, der blockiert.
Sie können die Methode db.collection.dropIndex () ausprobieren
medinfo.users.dropIndexes ()
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.
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.