2011-12-26 10 views
8

Ho una semplice raccolta "utenti" all'interno della quale in questo momento ho solo 2 documenti.E11000 indice di errore della chiave duplicata: errore insolito MongoDb

{ 
    "_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, 

ora se provo a creare un nuovo indice con {unico: true} sul campo EMAIL_ID, MongoDB mi lamentele con "E11000 duplicato indice di errore di chiave: db.users $ EMAIL_ID chiave DUP:. {: 46} ". Ottengo lo stesso errore anche dopo aver specificato {dropDups: true}, tuttavia non credo che questo sia il caso qui, poiché entrambi i documenti hanno un diverso ID di email memorizzato.

Non sono sicuro di cosa sta succedendo qui, qualsiasi suggerimento sarà molto apprezzato.

Edit: A piena vista dei documenti:

{ 
"_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 
} 
} 

e

{ 
"_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 
} 
} 

Ci sono un paio di campi come "DISPLAY_NAME", "registered_since", ecc, che ho omesso da il display sopra (non credo che abbiano alcun ruolo nell'errore generato, se ne hai ancora bisogno probabilmente posso incollare l'intero documento qui)

Sto usando erlang mongodb driver per le comunicazioni con la mia istanza di mongo. Tutti i campi che possono essere visti vengono salvati come byte binari, ecco perché vedi così strano email_id nel documento.

Nota: il formato del byte binario non è forzato dalla mia logica di codice, passo molto la stringa email_id all'interno dei miei documenti bson, ma finisco sempre per vedere i miei dati come byte binari. (Probabilmente perché il driver di erlang mongodb è stato scritto, in realtà non ho investigato su questo, dato che find(), find_one() e altre query funzionano come previsto anche con i campi salvati come byte binari)

Modifica:> db .users.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" : [ ] 
} 
+1

Mostraci tutti i documenti. –

+0

Perché la tua email sembra così strana? –

+0

controllare gli altri documenti ... –

risposta

5

Quando indici MongoDB un campo di matrice, in realtà indici i singoli elementi nella matrice. Questo è quello di supportare in modo efficiente le query alla ricerca di un particolare elemento di un array, come:

db.users.find({email_id: 46}) 

Dal momento che questo email_id (46) esiste in entrambi i documenti, ci sono chiavi duplicate nel vostro indice univoco.

Non sono sicuro del motivo per cui dovresti ottenere questo errore se hai impostato dropDups: true ... puoi mostrare un esempio di codice con come stai invocando createIndex? Dovresti provare anche dropDups: 1, poiché MongoDB tratta erroneamente 1 e true in questo contesto (vedi https://jira.mongodb.org/browse/SERVER-4562).

+0

beh penso che sia proprio così: dropDups funziona da mongo shell, non è riuscito dal pannello di amministrazione di mongorock Ho letto il documento di erlang bson che dice: "Attenzione, una stringa() sarà interpretata come una matrice di numeri interi.È necessario fornire le stringhe come utf8 binario, vedi sotto." - in questo caso non posso salvare il mio email_id come stringhe, dal momento che voglio che il campo email_id sia univoco come intera stringa, nessuna per carattere requisito di unicità requisito Ho letto. Questo è davvero disordinato che penso provenga dal driver erlang mongodb, se passo il mio campo email_id come un atomo, esso viene conservato come stringa completa n non come array di caratteri come sopra. –

+1

Ah, capisco. Quindi queste sono in realtà stringhe che sono erroneamente codificate come matrici di interi? In tal caso, dovresti essere sicuro di fare ciò che i documenti raccomandano riguardo al binario UTF8 in modo che siano salvati come stringhe in MongoDB. Inoltre, quale driver stai usando? – dcrosta

+0

sto usando il driver erlang mongodb di tony (https://github.com/TonyGen/mongodb-erlang) ... anzi tutto quello che bisogna fare è passare le stringhe come binari utf8 se devono essere salvate come stringhe ... se passati come elenchi di erlang, verranno archiviati come mostrato sopra in snippet, che porteranno a errori di creazione di chiavi univoci. Penso che questa domanda possa essere contrassegnata come chiusa. Si trattava più di leggere attentamente i documenti e di passare le stringhe come binari utf8 –

0

Per gli altri che hanno questo problema, controlla la tua versione di mongo con db.version(). Se stai usando Mongo 3 e stai cercando di usare dropDups per cancellare i duplicati, fallirà e ti darà questo errore.

Problemi correlati