E11000 duplicate-key-Fehler index: MongoDb ungewöhnliche Fehler
Habe ich ein einfaches "Benutzer" - Kollektion, die im inneren jetzt habe ich nur 2 Dokumente.
{
"_id": ObjectId("4ef8e1e41d41c87069000074"),
"email_id": {
"0": 109,
"1": 101,
"2": 64,
"3": 97,
{
"_id": ObjectId("4ef6d2641d41c83bdd000001"),
"email_id": {
"0": 109,
"1": 97,
"2": 105,
"3": 108,
nun, wenn ich versuche, einen neuen index erstellen mit {unique: true} auf email_id Feld, mongodb Beschwerden, die mich mit "E11000 duplicate-key-Fehler index: db.- Benutzer.$email_id dup-key: { : 46 }". Ich bekomme die gleichen Fehler, auch nach der Angabe {dropDups: true}, aber ich glaube nicht, das ist hier der Fall, da beide Dokument haben verschiedene E-Mail-id gespeichert ist.
Ich bin nicht sicher, was hier Los ist, alle Hinweise sind sehr willkommen.
Bearbeiten: Vollständige Ansicht der Dokumente:
{
"_id": ObjectId("4ef8e1e41d41c87069000074"),
"email_id": {
"0": 109,
"1": 101,
"2": 64,
"3": 97,
"4": 98,
"5": 104,
"6": 105,
"7": 110,
"8": 97,
"9": 118,
"10": 115,
"11": 105,
"12": 110,
"13": 103,
"14": 104,
"15": 46,
"16": 99,
"17": 111,
"18": 109
}
}
und
{
"_id": ObjectId("4ef6d2641d41c83bdd000001"),
"email_id": {
"0": 109,
"1": 97,
"2": 105,
"3": 108,
"4": 115,
"5": 102,
"6": 111,
"7": 114,
"8": 97,
"9": 98,
"10": 104,
"11": 105,
"12": 110,
"13": 97,
"14": 118,
"15": 64,
"16": 103,
"17": 109,
"18": 97,
"19": 105,
"20": 108,
"21": 46,
"22": 99,
"23": 111,
"24": 109
}
}
Gibt es ein paar weitere Felder wie "display_name", "registered_since", etc, die ich ausgelassen haben, aus der Anzeige oben (ich glaube nicht, dass Sie eine Rolle in der der Fehler geworfen, wenn Sie noch brauchen, Ihnen kann ich wahrscheinlich fügen Sie die gesamten Unterlagen hier)
Ich bin mit erlang-mongodb-Treiber für die Kommunikation mit meiner mongo-Instanz. Alle Felder, die als gesehen werden können, sind gespeichert als binäre bytes, das ist, warum sehen Sie so komisch email_id im Dokument.
Hinweis: Binär-byte-format ist nicht gezwungen, meinen code logic, ich habe sehr viel passieren string email_id in meinem bson-Dokumenten, aber ich immer am Ende zu sehen, meine Daten als binäre bytes. (Wahrscheinlich, weil, wie erlang mongodb-Treiber geschrieben, dass ich nicht wirklich untersuchen auf diese, da mein find(), find_one() und andere Abfragen nicht wie erwartet funktioniert auch mit Feldern gespeichert als binäre bytes)
Edit: > db.Benutzer.findOne()
{
"_id" : ObjectId("4ef6d2641d41c83bdd000001"),
"email_id" : [
109,
97,
105,
108,
115,
102,
111,
114,
97,
98,
104,
105,
110,
97,
118,
64,
103,
109,
97,
105,
108,
46,
99,
111,
109
],
"display_name" : [
65,
98,
104,
105,
110,
97,
118,
43,
83,
105,
110,
103,
104
],
"provider" : [
106,
97,
120,
108,
46,
105,
109
],
"provider_id" : [ ]
}
- Zeigen Sie uns voller Dokumente.
- Warum Ihre E-Mail sieht so komisch aus?
- überprüfen Sie die anderen Dokumente...
- Sind die Werte für
email_id
eigentlich Filialdokumente indiziert durch die string-keys, die ganzen zahlen? Oder sind Sie arrays, und dies ist nur die Darstellung von Ihnen in Ihrer Programmiersprache? Auch, welche Sprache verwenden Sie? - Sie benötigen mehr Informationen liefern. Es erscheint die einzureichenden Unterlagen unvollständig sind? Bedeutet "email_id" haben mehr als 3 Elemente? Vielleicht element 46 wird dupliziert, in die beiden Dokumente? Wann/wie werden Sie einen index hinzufügen? Ist diese in einem Skript oder in der mongo-shell? Wie @Sergej Tulentsev sagt, sollten Sie eine vollständige Sicht auf die Dokumente. Und der kleinste Satz von code, den Sie können, das das problem reproduziert.
- ich habe versucht das erstellen der Indizes einfügen von zwei Dokumente in der Sammlung. Ich habe versucht das erstellen von Indizes mit beiden mongo shell und rockmongo admin-panel mit dem gleichen Fehler. Ich bin nicht sicher, warum wirklich mein email_id in Dokumente zeigen, wie oben beschrieben. Meine bson-Dokument beim einfügen innerhalb der Kollektion ist ebenso einfach wie {email_id, "[email protected]}.
- Können Sie fügen Sie die Ausgabe von
db.users.findOne()
aus der mongo-shell? Ich bin mir immer noch nicht sicher, ob Mongo ist die Behandlung diese als arrays oder als Filialdokumente. - wie @dcrosta sagt, wie mongoDB ist die Speicherung der E-Mail scheint der Schlüssel zu sein. Wenn die binäre Darstellung als Filialdokumenten, es sind einige der "Schlüssel", die doppelte zwischen den beiden Dokumenten, die Sie anzeigen (obwohl die ' - Taste{:46}' ist nicht sinnvoll.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn MongoDB Indizes eines array-Feldes, es tatsächlich zu Indizes der einzelnen Elemente im array. Dies ist die effiziente Unterstützung von Abfragen der Suche nach einem bestimmten element in einem array, wie:
Da diese
email_id
(46) vorhanden ist, in beiden Dokumenten gibt es doppelte Schlüssel in Ihrer eindeutigen index.Ich bin mir nicht sicher, warum Sie diese Fehlermeldung erhalten, wenn Sie
dropDups: true
set... können Sie ein code-Beispiel, wie man aufrufencreateIndex
? Sie sollten auch versuchendropDups: 1
wie MongoDB fälschlicherweise behandelt1
undtrue
anders in diesem Zusammenhang (siehe https://jira.mongodb.org/browse/SERVER-4562).utf()
Funktion zu konvertieren string in einen UTF-8-Strings für die Speicherung in MongoDB, sonst wird der Treiber speichern Sie es als ein array von code-points (also ints). Sobald Sie dies tun, wird es einen skalaren Wert, und nicht ein array, in mongo und du wirst in der Lage sein, um Ihre eindeutigen index.Für andere die dieses problem auftreten, überprüfen Sie Ihre mongo version mit
db.version()
. Wenn Sie mit Mongo 3 und versuchen, zu verwenden dropDups zu löschen Duplikate, wird es nicht und geben Sie diesen Fehler.