Es folgt mein user
Schema im user.js
Modell -
var userSchema = new mongoose.Schema({
local: {
name: { type: String },
email : { type: String, require: true, unique: true },
password: { type: String, require:true },
},
facebook: {
id : { type: String },
token : { type: String },
email : { type: String },
name : { type: String }
}
});
var User = mongoose.model('User',userSchema);
module.exports = User;
So verwende ich es in meinem Controller -
var user = require('./../models/user.js');
So speichere ich es in der Datenbank -
user({'local.email' : req.body.email, 'local.password' : req.body.password}).save(function(err, result){
if(err)
res.send(err);
else {
console.log(result);
req.session.user = result;
res.send({"code":200,"message":"Record inserted successfully"});
}
});
Fehler -
{"name":"MongoError","code":11000,"err":"insertDocument :: caused by :: 11000 E11000 duplicate key error index: mydb.users.$email_1 dup key: { : null }"}
Ich habe die DB-Sammlung überprüft und es gibt keinen solchen doppelten Eintrag. Lassen Sie mich wissen, was ich falsch mache.
FYI - req.body.email
und req.body.password
holen Werte.
Ich habe auch diesen Beitrag überprüft, aber keine Hilfe STACK LINK
Wenn ich es vollständig entfernt habe, wird das Dokument eingefügt, andernfalls wird der Fehler "Duplizieren" ausgegeben, selbst wenn ich einen Eintrag in der local.email habe
unique: false
hatte keine Auswirkungen. Mir wurde klar, dass ich zuerst den Tisch fallen lassen musste und dann würde es funktionieren. Sie können wie etwas tundb.whateverthecollection.drop({})
. Seien Sie vorsichtig, es löscht die Sammlung.Antworten:
Die Fehlermeldung besagt, dass bereits ein Datensatz
null
als E-Mail vorhanden ist. Mit anderen Worten, Sie haben bereits einen Benutzer ohne E-Mail-Adresse.Die dazugehörige Dokumentation:
eindeutige Indizes
Mit anderen Worten, ein spärlicher Index ist in Ordnung, wenn mehrere Dokumente alle
null
Werte haben.spärliche Indizes
Aus Kommentaren:
Ihr Fehler besagt, dass der Schlüssel benannt ist
mydb.users.$email_1
, was mich vermuten lässt, dass Sie einen Index für beideusers.email
und habenusers.local.email
(der erstere ist alt und wird derzeit nicht verwendet). Das Entfernen eines Feldes aus einem Mungo-Modell wirkt sich nicht auf die Datenbank aus. Überprüfen Sie,mydb.users.getIndexes()
ob dies der Fall ist, und entfernen Sie den unerwünschten Index manuell mitmydb.users.dropIndex(<name>)
.quelle
mydb.users.$email_1
, was mich vermuten lässt, dass Sie einen Index für beideusers.email
und habenusers.local.email
(der erstere ist alt und wird derzeit nicht verwendet). Das Entfernen eines Feldes aus einem Mungo-Modell wirkt sich nicht auf die Datenbank aus. Überprüfen Sie,mydb.users.getIndexes()
ob dies der Fall ist, und entfernen Sie den unerwünschten Index manuell mitmydb.users.dropIndex(<name>)
.db.users.dropIndexes()
Sie, wenn Sie mehrereWenn Sie sich noch in Ihrer Entwicklungsumgebung befinden, würde ich die gesamte Datenbank löschen und mit Ihrem neuen Schema neu beginnen.
Über die Befehlszeile
quelle
db.collection.dropIndexes()
wie cs_stackX sagteÜberprüfen Sie die Sammlungsindizes.
Ich hatte dieses Problem aufgrund veralteter Indizes in der Sammlung für Felder, die unter einem anderen neuen Pfad gespeichert werden sollten.
Mongoose fügt einen Index hinzu, wenn Sie das Feld als eindeutig angeben.
quelle
Grundsätzlich bedeutet dieser Fehler, dass Sie einen eindeutigen Index für ein bestimmtes Feld hatten, z. B. "email_address". Mongodb erwartet daher für jedes Dokument in der Sammlung einen eindeutigen E-Mail-Adresswert.
Nehmen wir also an, früher in Ihrem Schema wurde der eindeutige Index nicht definiert, und dann haben Sie zwei Benutzer mit derselben E-Mail-Adresse oder ohne E-Mail-Adresse (Nullwert) angemeldet.
Später haben Sie gesehen, dass ein Fehler aufgetreten ist. Sie versuchen also, dies zu korrigieren, indem Sie dem Schema einen eindeutigen Index hinzufügen. Ihre Sammlung enthält jedoch bereits Duplikate. In der Fehlermeldung wird daher angegeben, dass Sie keinen Duplikatwert erneut einfügen können.
Sie haben im Wesentlichen drei Möglichkeiten:
Löschen Sie die Sammlung
db.users.drop();
Suchen Sie das Dokument mit diesem Wert und löschen Sie es. Angenommen, der Wert war null. Sie können ihn löschen mit:
db.users.remove({ email_address: null });
Löschen Sie den eindeutigen Index:
db.users.dropIndex(indexName)
Ich hoffe das hat geholfen :)
quelle
Ich möchte die Antwort / Lösung darauf so erklären, wie ich es einem 5-Jährigen erkläre, damit jeder verstehen kann.
Ich habe eine App. Ich möchte, dass sich Leute mit ihrer E-Mail-Adresse, ihrem Passwort und ihrer Telefonnummer registrieren. In meiner MongoDB-Datenbank möchte ich Personen anhand ihrer Telefonnummer und E-Mail-Adresse eindeutig identifizieren. Dies bedeutet, dass sowohl die Telefonnummer als auch die E-Mail-Adresse für jede Person eindeutig sein müssen.
Es gibt jedoch ein Problem: Ich habe festgestellt, dass jeder eine Telefonnummer hat, aber nicht jeder eine E-Mail-Adresse.
Diejenigen, die keine E-Mail-Adresse haben, haben mir versprochen, dass sie nächste Woche eine E-Mail-Adresse haben werden. Aber ich möchte, dass sie trotzdem registriert werden - also fordere ich sie auf, ihre Telefonnummern zu registrieren, wenn sie das E-Mail-Eingabefeld leer lassen.
Sie tun es.
Meine Datenbank BRAUCHT ein eindeutiges E-Mail-Adressfeld - aber ich habe viele Leute mit 'null' als E-Mail-Adresse. Also gehe ich zu meinem Code und sage meinem Datenbankschema, dass leere / null E-Mail-Adressfelder zugelassen werden sollen, die ich später mit eindeutigen E-Mail-Adressen ausfüllen werde, wenn die Personen, die versprochen haben, ihre E-Mails nächste Woche zu ihren Profilen hinzuzufügen.
Jetzt ist es eine Win-Win-Situation für alle (außer für Sie; -]): Die Leute registrieren sich, ich bin froh, ihre Daten zu haben ... und meine Datenbank ist glücklich, weil sie gut genutzt wird ... aber was ist mit Ihnen? Ich muss Ihnen noch den Code geben, der das Schema erstellt hat.
Hier ist der Code: HINWEIS: Die Eigenschaft sparse in E-Mail weist meine Datenbank an, Nullwerte zuzulassen, die später mit eindeutigen Werten gefüllt werden.
Ich hoffe ich habe es schön erklärt. Viel Spaß beim Codieren / Hacken von NodeJS!
quelle
sparse
Index und eineunique
Validierung wünschen und andere Felder haben, die nicht erforderlich sind , müssen Sie diepartialFilterExpression
Option verwenden. Siehe diese Antwort stackoverflow.com/a/34600171/728287Ich hatte ähnliche Probleme. Ich lösche nur die Indizes bestimmter Felder, dann funktioniert es für mich. https://docs.mongodb.com/v3.2/reference/method/db.collection.dropIndexes/
quelle
Melden Sie sich in diesem Fall bei Mongo an und suchen Sie den Index, den Sie nicht mehr verwenden (im Fall von OP 'email'). Wählen Sie dann Drop Index
quelle
Dies ist meine relavante Erfahrung:
Im 'Benutzer'-Schema habe ich' Name 'als eindeutigen Schlüssel festgelegt und dann eine Ausführung ausgeführt, die meiner Meinung nach die Datenbankstruktur eingerichtet hat.
Dann habe ich den eindeutigen Schlüssel in "Benutzername" geändert und beim Speichern von Daten in der Datenbank den Wert "Name" nicht mehr übergeben. Daher kann der Mongodb den Wert 'name' des neuen Datensatzes automatisch auf null setzen, was ein doppelter Schlüssel ist. Ich habe versucht, den Schlüssel 'name' als nicht eindeutigen Schlüssel
{name: {unique: false, type: String}}
im Schema 'User' festzulegen, um die ursprüngliche Einstellung zu überschreiben. Es hat jedoch nicht funktioniert.Endlich habe ich meine eigene Lösung gefunden:
Legen Sie einfach einen zufälligen Schlüsselwert fest, der beim Speichern Ihres Datensatzes wahrscheinlich nicht mit dem Schlüssel 'name' dupliziert wird. Die einfache mathematische Methode erstellt
'' + Math.random() + Math.random()
eine zufällige Zeichenfolge.quelle
Ich hatte das gleiche Problem. Versuchtes Debuggen auf verschiedene Arten konnte nicht herausfinden. Ich habe versucht, die Sammlung fallen zu lassen, und danach hat es gut funktioniert. Dies ist zwar keine gute Lösung, wenn Ihre Sammlung viele Dokumente enthält. Wenn Sie sich jedoch in einem frühen Entwicklungsstadium befinden, versuchen Sie, die Sammlung zu löschen.
quelle
Dies liegt daran, dass es bereits eine Sammlung mit demselben Namen mit Konfiguration gibt. Entfernen Sie die Sammlung einfach über die Mongo-Shell von Ihrem Mongodb und versuchen Sie es erneut.
Führen Sie jetzt Ihre Anwendung aus, es sollte funktionieren
quelle
Ich hatte ein ähnliches Problem und stellte fest, dass Mongo standardmäßig nur ein Schema pro Sammlung unterstützt. Speichern Sie Ihr neues Schema entweder in einer anderen Sammlung oder löschen Sie die vorhandenen Dokumente mit dem inkompatiblen Schema in Ihrer aktuellen Sammlung. Oder finden Sie eine Möglichkeit, mehr als ein Schema pro Sammlung zu haben.
quelle
Ich habe mich auch diesem Problem gestellt und es gelöst. Dieser Fehler zeigt, dass hier bereits eine E-Mail vorhanden ist. Sie müssen diese Zeile also nur aus Ihrem Modell für das E-Mail-Attribut entfernen.
Dies könnte möglich sein, auch wenn es nicht funktioniert. Sie müssen also nur die Sammlung aus Ihrer MongoDB löschen und Ihren Server neu starten.
quelle
Ich habe das gleiche Problem, als ich die folgende Konfiguration in meiner config / models.js hatte
Das Ändern der Migration von "ändern" in "sicher" hat das Problem für mich behoben.
quelle
Das gleiche Problem nach dem Entfernen von Eigenschaften aus einem Schema nach dem ersten Erstellen einiger Indizes beim Speichern. Das Entfernen der Eigenschaft aus dem Schema führt zu einem Nullwert für eine nicht vorhandene Eigenschaft, die noch einen Index hatte. Hier hilft es, den Index zu löschen oder mit einer neuen Sammlung von Grund auf neu zu beginnen.
Hinweis: Die Fehlermeldung führt Sie in diesem Fall. es hat einen Pfad, der nicht mehr existiert. In meinem Fall war der alte Pfad ... $ uuid_1 (dies ist ein Index!), aber der neue ist .... * priv.uuid_1
quelle
Ich hatte das gleiche Problem, als ich versuchte, das mit Mangoose definierte Schema zu ändern. Ich denke, das Problem ist auf den Grund zurückzuführen, dass beim Erstellen einer Sammlung einige grundlegende Prozesse ausgeführt werden, z. B. die Beschreibung der Indizes, die dem Benutzer verborgen sind (zumindest in meinem Fall). Die beste Lösung, die ich gefunden habe, bestand darin, die gesamte Sammlung zu löschen und wieder von vorne beginnen.
quelle
Ich hatte das gleiche Problem. Problem war, dass ich ein Feld aus dem Modell entfernt habe. Als ich db fallen ließ, wurde es behoben
quelle
Für zukünftige Entwickler empfehle ich, den Index in INDEX TAB mit Kompass zu löschen. Dieses Dokument löscht KEIN Dokument in Ihrer Sammlung. Verwalten von Indizes
quelle
Ändern Sie den Sammlungsnamen, falls er bereits in der Datenbank vorhanden ist. Es wird ein Fehler angezeigt. Und wenn Sie eine Eigenschaft als eindeutig angegeben haben, tritt der gleiche Fehler auf.
quelle
Hatte das gleiche Problem, das ich durch Entfernen des
unique
Attributs für die Eigenschaft behoben habe .Finden Sie einfach eine andere Möglichkeit, um eindeutige Eigenschaftswerte für Ihr Schema zu überprüfen oder zu überprüfen.
quelle
Bitte löschen Sie die Sammlung oder löschen Sie die gesamte Sammlung aus der MongoDB-Datenbank und versuchen Sie es später erneut.
quelle