Ich versuche, MongoDB einen doppelten Wert anhand seines Index erkennen zu lassen. Ich denke, dass dies in MongoDB möglich ist, aber durch den Mongoose-Wrapper scheinen die Dinge kaputt zu sein. Also für so etwas:
User = new Schema ({
email: {type: String, index: {unique: true, dropDups: true}}
})
Ich kann 2 Benutzer mit derselben E-Mail speichern. Verflixt.
Das gleiche Problem wurde hier zum Ausdruck gebracht: https://github.com/LearnBoost/mongoose/issues/56 , aber dieser Thread ist alt und führt zu nichts.
Im Moment rufe ich die Datenbank manuell an, um den Benutzer zu finden. Dieser Anruf ist nicht teuer, da "E-Mail" indiziert ist. Aber es wäre trotzdem schön, wenn es nativ gehandhabt würde.
Hat jemand eine Lösung dafür?
Antworten:
Hoppla! Sie müssen nur Mongo neu starten.
quelle
Und auch neu indizieren mit:
Da ich keine wichtigen Daten habe, können Sie beim Testen auch Folgendes tun:
quelle
Ich bin auf dasselbe Problem gestoßen : Ich habe die eindeutige Einschränkung für das
email
Feld zu unseremUserSchema
hinzugefügt, nachdem ich bereits Benutzer zur Datenbank hinzugefügt hatte, und konnte Benutzer weiterhin mit betrogenen E-Mails speichern. Ich habe dies folgendermaßen gelöst:1) Entfernen Sie alle Dokumente aus der Benutzersammlung.
2) Führen Sie in der Mongo-Shell den folgenden Befehl aus:
db.users.createIndex({email: 1}, {unique: true})
Beachten Sie in Bezug auf Schritt 1 Folgendes aus Mongos Dokumenten:
https://docs.mongodb.com/manual/core/index-unique/
quelle
Dieses Verhalten tritt auch auf, wenn Sie in Mongo einige Duplikate hinterlassen haben. Mongoose wird versuchen, sie in Mongo zu erstellen, wenn Ihre Anwendung gestartet wird.
Um dies zu verhindern, können Sie diesen Fehler folgendermaßen behandeln:
quelle
Ok, ich konnte dies aus der Mongoshell heraus beheben, indem ich den Index für das Feld hinzufügte und die eindeutige Eigenschaft festlegte:
Shell sollte folgendermaßen reagieren:
Nun, um schnell von der Mongoshell zu testen:
Sollte geben: WriteResult ({"nInserted": 1})
Aber wenn Sie noch einmal wiederholen:
Wird geben:
quelle
Ich habe so etwas gemacht:
Ich habe die
Foo.createIndexes()
Zeile hinzugefügt , da beim Ausführen des Codes die folgende Warnung angezeigt wurde:Ich bin nicht sicher, ob
Foo.createIndexes()
es asynchron ist, aber AFAIK-Dinge scheinen gut zu funktionierenquelle
index: true
Erstellung meines eindeutigen Index.Laut Dokumentation: https://docs.mongodb.com/v2.6/tutorial/modify-an-index/
MONGO NICHT NEU STARTEN!
1 - Löschen Sie die Sammlung
2 - Indizieren Sie die Tabelle neu
quelle
Mungo ist etwas locker, wenn eindeutige Indizes auf Anwendungsebene erzwungen werden. Daher wird es bevorzugt, entweder Ihre eindeutigen Indizes mithilfe der Mongo-Cli aus der Datenbank selbst zu erzwingen oder Mungo explizit mitzuteilen, dass Sie den
unique
Index ernst nehmen, indem Sie die folgende Codezeile direkt nach Ihrem UserSchema schreiben:UserSchema.index({ username: 1, email: 1 }, { unique: true});
Dadurch wird der eindeutige Index sowohl für
username
als auch füremail
Felder in Ihrem UserSchema erzwungen. Prost.quelle
Mungo-Unique-Validator
So verwenden Sie dieses Plugin:
1) npm install - Mungo-Unique-Validator speichern
2) Befolgen Sie in Ihrem Schema diese Anleitung:
3) Mungo-Methoden
Wenn Sie Methoden wie diese verwenden, müssen
findOneAndUpdate
Sie dieses Konfigurationsobjekt übergeben:{ runValidators: true, context: 'query' }
4) zusätzliche Optionen
Groß- und Kleinschreibung nicht berücksichtigen
Verwenden Sie die Option uniqueCaseInsensitive in Ihrem Schema
ie. email: { type: String, index: true, unique: true, required: true, uniqueCaseInsensitive: true }
benutzerdefinierte Fehlermeldungen
ie. exampleSchema.plugin(uniqueValidator, { message: 'Error, expected {PATH} to be unique.' });
Jetzt können Sie die eindeutige Eigenschaft zu Ihren Schemas hinzufügen / löschen, ohne sich Gedanken über einen Neustart von Mongo, das Löschen von Datenbanken oder das Erstellen von Indizes machen zu müssen.
Vorsichtsmaßnahmen (aus den Dokumenten):
Da wir uns auf asynchrone Operationen verlassen, um zu überprüfen, ob ein Dokument in der Datenbank vorhanden ist, können zwei Abfragen gleichzeitig ausgeführt werden. Beide erhalten 0 zurück und werden dann beide in MongoDB eingefügt.
Außer dem automatischen Sperren der Sammlung oder dem Erzwingen einer einzelnen Verbindung gibt es keine echte Lösung.
Für die meisten unserer Benutzer ist dies kein Problem, aber ein Randfall, den Sie beachten sollten.
quelle
Mungo kann stillschweigend keinen eindeutigen Index hinzufügen, wenn:
Listen Sie im ersten Fall die Indizes mit auf
db.collection.getIndexes()
und löschen Sie den alten Index mitdb.collection.dropIndex("index_name")
. Wenn Sie die Mongoose-Anwendung neu starten, sollte der neue Index korrekt hinzugefügt werden.Im zweiten Fall müssen Sie die Duplikate entfernen, bevor Sie die Mongoose-Anwendung neu starten.
quelle
Neueste Antwort: Mongodb muss überhaupt nicht neu gestartet werden. Wenn Colleciton bereits gleichnamige Indizes hat, erstellt Mongoose Ihre Indizes nicht erneut. Löschen Sie also zuerst die vorhandenen Indizes von Colleciton. Wenn Sie Mungo ausführen, wird ein neuer Index erstellt Der obige Prozess hat mein Problem gelöst.
quelle
Sie können dieses Problem auch beheben, indem Sie den Index löschen.
Nehmen wir an, Sie möchten den eindeutigen Index aus Sammlung
users
und Feld entfernen. Geben Sie Folgendes einusername
:db.users.dropIndex('username_1');
quelle
Wenn die Tabelle / Sammlung leer ist, erstellen Sie einen eindeutigen Index für das Feld:
Wenn die Tabelle / Sammlung nicht leer ist, löschen Sie die Sammlung und erstellen Sie einen Index:
Starten Sie nun mongoDB neu.
quelle
Überprüfen Sie, ob autoIndex im Schema true ist. Wenn Sie die Optionen mongoose.connect verwenden, wird möglicherweise false (Standardwert true) festgelegt
quelle
Ich hatte eine Weile mit dem gleichen Problem zu kämpfen und viel gesucht, und die Lösung für mich war die
createIndexes()
Funktion.Ich wünschte, das hilft.
Der Code wird also so sein.
quelle
Wenn Sie die Option
autoIndex: false
in der Verbindungsmethode wie folgt verwenden:mongoose.connect(CONNECTION_STRING, { autoIndex: false });
Versuchen Sie, das zu entfernen. Wenn das nicht funktioniert, starten Sie mongodb neu, wie in diesem Thread vorgeschlagen.
quelle
Sie können Ihr Schema als definieren
Aber vielleicht funktioniert dies nicht, wenn bereits ein Dokument vorhanden ist und Sie danach das Schema des Benutzers geändert haben. Sie können einen E-Mail-Index für diese Benutzersammlung erstellen, wenn Sie die Sammlung nicht löschen möchten. Mit diesem Befehl können Sie einen Index für E-Mails erstellen.
Oder Sie können die Sammlung einfach löschen und den Benutzer erneut hinzufügen.
Zum Löschen der Sammlung können Sie Folgendes eingeben:
quelle
Als ich auf dieses Problem stieß, habe ich versucht, die Datenbank zu löschen und den Server (nodemon) viele Male neu zu starten, und keiner der Tricks hat überhaupt nicht funktioniert. Ich habe über Robo 3T die folgende Lösung gefunden:
_id_
als Standard angezeigt. Wählen Sie nun Index hinzufügenemail
für das E-Mail-FeldStellen Sie Schlüssel als JSON bereit. Beispielsweise
Klicken Sie auf das Kontrollkästchen Eindeutig
Dadurch wird sichergestellt, dass keine doppelten E-Mails in der MongoDB gespeichert werden.
quelle
Stellen Sie sicher, dass in Ihrer Sammlung das Feld, auf das Sie gerade den eindeutigen Index gesetzt haben, nicht redundant ist.
Dann starten Sie einfach Ihre App (Mungo) neu. Das Hinzufügen eines Index schlägt nur stillschweigend fehl.
quelle
Alle Dokumente aus der Sammlung entfernen:
Und ein Neustart hat, wie andere sagten, für mich funktioniert
quelle
Wenn Ihre MongoDB als Dienst arbeitet (eine einfache Möglichkeit, dies zu finden, besteht darin, dass Sie keine Verbindung zur Datenbank herstellen müssen, ohne die Datei mongod.exe über das Terminal zu starten), müssen Sie den Dienst nach den Änderungen möglicherweise neu starten und / oder löschen Sie Ihre Datenbank vollständig.
Es ist ziemlich seltsam, weil für einige Benutzer nur das Löschen einer einzelnen Sammlung funktioniert hat. Einige von ihnen mussten nur die Datenbank löschen. Aber die haben bei mir nicht funktioniert. Ich habe die Datenbank gelöscht und dann den MongoDB Server-Dienst neu gestartet.
Um einen Dienst für die Dienstsuche in der Windows-Suchleiste neu zu starten und dann den MongoDB-Dienst zu finden, doppelklicken Sie zum Öffnen, stoppen Sie den Dienst und starten Sie ihn erneut.
Wenn die anderen Methoden bei Ihnen nicht funktioniert haben, wird dies meiner Meinung nach den Job machen.
quelle