it-swarm.com.de

E11000 doppelter Schlüsselfehlerindex im Mongodb-Mungo

Es folgt mein user Schema in 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 benutze 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 Datenbanksammlung ü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 rufen Werte ab.

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

185
Trialcoder

Die Fehlermeldung besagt, dass es bereits einen Datensatz mit null als E-Mail gibt. Mit anderen Worten, Sie haben bereits einen Benutzer ohne E-Mail-Adresse.

Die dazugehörige Dokumentation:

Wenn ein Dokument keinen Wert für das indizierte Feld in einem eindeutigen Index hat, speichert der Index einen Nullwert für dieses Dokument. Aufgrund der eindeutigen Einschränkung lässt MongoDB nur ein Dokument zu, dem das indizierte Feld fehlt. Wenn es mehr als ein Dokument ohne Wert für das indizierte Feld gibt oder das indizierte Feld fehlt, schlägt die Indexerstellung mit einem doppelten Schlüsselfehler fehl.

Sie können die eindeutige Einschränkung mit dem Sparse-Index kombinieren, um diese Nullwerte aus dem eindeutigen Index herauszufiltern und den Fehler zu vermeiden.

eindeutige Indizes

Sparse-Indizes enthalten nur Einträge für Dokumente mit dem indizierten Feld, auch wenn das Indexfeld einen Nullwert enthält.

Mit anderen Worten, ein spärlicher Index ist in Ordnung, wenn mehrere Dokumente jeweils null Werte haben.

spärliche Indizes


Aus Kommentaren:

Dein Fehler besagt, dass der Schlüssel mydb.users.$email_1 heißt, was mich vermuten lässt, dass du einen Index für users.email und users.local.email hast (Ersteres ist alt und wird im Moment nicht verwendet). Das Entfernen eines Feldes aus einem Mongoose-Modell wirkt sich nicht auf die Datenbank aus. Prüfen Sie dies mit mydb.users.getIndexes() und entfernen Sie den unerwünschten Index manuell mit mydb.users.dropIndex(<name>).

189
RikkusRukkus

Wenn Sie sich noch in Ihrer Entwicklungsumgebung befinden, würde ich die gesamte Datenbank löschen und mit Ihrem neuen Schema von vorne beginnen.

Von der Kommandozeile

➜ mongo
use dbName;
db.dropDatabase();
exit
50
Rick

Überprüfen Sie die Sammlungsindizes.

Ich hatte dieses Problem aufgrund veralteter Indizes in der Auflistung von Feldern, die unter einem anderen neuen Pfad gespeichert werden sollten.

Mongoose fügt einen Index hinzu, wenn Sie ein Feld als eindeutig angeben.

16
Yegor

Grundsätzlich besagt dieser Fehler, dass Sie einen eindeutigen Index für ein bestimmtes Feld hatten, z. B. "email_address". Daher erwartet mongodb einen eindeutigen Wert für die E-Mail-Adresse für jedes Dokument in der Sammlung.

Nehmen wir an, dass zu einem früheren Zeitpunkt in Ihrem Schema der eindeutige Index nicht definiert wurde und Sie dann 2 Benutzer mit derselben E-Mail-Adresse oder ohne E-Mail-Adresse (Nullwert) angemeldet haben.

Später haben Sie gesehen, dass ein Fehler aufgetreten ist. Sie versuchen es also 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 doppelten Wert erneut einfügen können.

Sie haben im Wesentlichen drei Möglichkeiten:

  1. Lass die Sammlung fallen

    db.users.drop();

  2. Suchen Sie das Dokument mit diesem Wert und löschen Sie es. Angenommen, der Wert war null. Sie können ihn löschen, indem Sie Folgendes verwenden:

    db.users.remove({ email_address: null });

  3. Löschen Sie den eindeutigen Index:

    db.users.dropIndex(indexName)

Ich hoffe das hat geholfen :)

14
Daksh Miglani

Ich möchte die Antwort/Lösung dazu 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 ihrer E-Mail-Adresse eindeutig identifizieren. Das 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 BENÖTIGT ein eindeutiges E-Mail-Adressfeld - aber ich habe viele Leute, deren E-Mail-Adresse "Null" ist. Also gehe ich zu meinem Code und fordere mein Datenbankschema auf, leere/leere E-Mail-Adressfelder zuzulassen, die ich später mit eindeutigen E-Mail-Adressen ausfüllen werde, wenn die Personen, die versprochen haben, nächste Woche ihre E-Mails zu ihrem Profil hinzuzufügen.

So ist es jetzt 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 froh, weil sie gut genutzt werden ... 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.

var userSchema = new mongoose.Schema({
  local: {
    name: { type: String },
    email : { type: String, require: true, index:true, unique:true,sparse: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;

Ich hoffe ich habe es schön erklärt. Viel Spaß beim NodeJS-Codieren/Hacken!

11
Daggie Blanqx

Ich sah mich ähnlichen Problemen gegenüber. Ich lösche nur die Indexe bestimmter Felder, dann funktioniert es für mich. https://docs.mongodb.com/v3.2/reference/method/db.collection.dropIndexes/

7
mad Man

Dies ist meine relavante Erfahrung:

Im 'User'-Schema habe ich' name 'als eindeutigen Schlüssel festgelegt und dann eine Ausführung ausgeführt, von der ich glaube, dass sie die Datenbankstruktur eingerichtet hat.

Dann habe ich den eindeutigen Schlüssel als "Benutzername" geändert und beim Speichern von Daten in der Datenbank den Wert "Name" nicht mehr übergeben. So kann der Mongodb automatisch den 'Name'-Wert eines neuen Datensatzes auf null setzen, was ein doppelter Schlüssel ist. Ich habe versucht, den eingestellten 'Name'-Schlüssel als nicht eindeutigen Schlüssel {name: {unique: false, type: String}} im' Benutzer'-Schema festzulegen, um die ursprüngliche Einstellung zu überschreiben. Es hat jedoch nicht funktioniert.

Endlich habe ich meine eigene Lösung gemacht:

Legen Sie einfach einen zufälligen Schlüsselwert fest, der beim Speichern Ihres Datensatzes wahrscheinlich nicht doppelt als Namensschlüssel verwendet wird. Simply Math Methode '' + Math.random() + Math.random() erzeugt eine zufällige Zeichenkette.

4
Kobe Luo

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 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, löschen Sie die Sammlung.

db.users.drop();
3
Sandip Subedi

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 der aktuellen Sammlung. Oder finden Sie einen Weg, mehr als ein Schema pro Sammlung zu haben.

2
Embedded_Mugs

Dies liegt daran, dass es bereits eine Sammlung mit demselben Namen mit Konfiguration gibt. Entfernen Sie einfach die Sammlung von Ihrem Mongodb über Mongo Shell und versuchen Sie es erneut.

db.collectionName.remove ()

führen Sie nun Ihre Anwendung aus, sie sollte funktionieren

2
Ignatius Andrew

Ich hatte das gleiche Problem, als ich versuchte, das mit mangoose definierte Schema zu ändern. Ich denke, dass das Problem auf den Grund zurückzuführen ist, dass beim Erstellen einer Sammlung einige zugrunde liegende Vorgänge ausgeführt werden, z. B. das Beschreiben der Indizes, die für den Benutzer nicht sichtbar sind (zumindest in meinem Fall). Die beste Lösung bestand darin, die gesamte Sammlung zu löschen und wieder von vorne anfangen.

1
Rahul P

Ich habe das gleiche Problem, als ich die folgende Konfiguration in meiner config/models.js hatte

module.exports.models = {
  connection: 'mongodb',
  migrate: 'alter'
}

Das Ändern der Migration von "Ändern" zu "Sicher" hat das Problem für mich behoben.

module.exports.models = {
  connection: 'mongodb',
  migrate: 'safe'
}
1
Jam Risser

gleiches Problem nach dem Entfernen von Eigenschaften aus einem Schema after erst einige Indizes beim Speichern erstellen. 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 zu beginnen.

hinweis: Die Fehlermeldung führt Sie in diesem Fall. es hat einen weg, den es nicht mehr gibt. In meinem Fall war der alte Pfad ... $ uuid_1 (dies ist ein Index!), aber der neue ist .... * priv.uuid_1

1
chhtm

Ich hatte das gleiche Problem. Problem war, dass ich ein Feld aus dem Modell entfernt habe. Als ich db fallen ließ, repariert es

1
user86168

Ich habe mich auch mit diesem Problem befasst und es gelöst. Dieser Fehler zeigt an, dass die E-Mail hier bereits vorhanden ist. Sie müssen diese Zeile also nur aus Ihrem Modell für E-Mail-Attribut entfernen.

unique: true

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.

1
Inamur Rahman