2011-12-26 19 views
8

Tengo una simple colección de "usuarios" dentro de la cual ahora solo tengo 2 documentos.E11000 índice de error de clave duplicada: MongoDb error inusual

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

ahora si intento crear un nuevo índice con {único: true} en el campo email_ID, me quejas mongodb con "E11000 duplicar índice de error de clave: db.users clave DUP $ email_ID:. {:} 46 ". Recibo el mismo error incluso después de especificar {dropDups: true}, sin embargo, no creo que este sea el caso aquí, ya que ambos documentos tienen diferentes id de correo electrónico almacenados.

No estoy seguro de lo que está pasando aquí, cualquier puntero será muy apreciado.

Editar: A la vista de los documentos:

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

y

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

Hay un par de más campos como "display_name", "registered_since", etc, que he omitido de la pantalla de arriba (no creo que tengan ningún rol en el error arrojado, si aún los necesita, probablemente pueda pegar toda la documentación aquí)

Estoy usando erlang mongodb driver para la comunicación con mi instancia de mongo. Todos los campos que se pueden ver se guardan como bytes binarios, por eso se ve un email_id tan extraño en el documento.

Nota: el formato de bytes binarios no está forzado por mi lógica de código, paso mucho cadena string_id dentro de mis documentos bson, pero siempre termino viendo mis datos como bytes binarios. (Probablemente porque como erlang mongodb driver está escrito, realmente no investigé sobre esto, ya que mi find(), find_one() y otras consultas funcionan como se espera incluso con campos guardados como bytes binarios)

Edit:> 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

Muéstranos documentos completos. –

+0

¿Por qué su correo electrónico se ve tan extraño? –

+0

revise los otros documentos ... –

Respuesta

5

Cuando índices MongoDB un campo de matriz, en realidad los índices de los elementos individuales de la matriz. Esto es para apoyar de manera eficiente las consultas en busca de un elemento particular de una matriz, como:

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

Desde este email_id (46) existe en ambos documentos, hay claves duplicadas en el índice único.

No estoy seguro de por qué obtendría este error si tiene dropDups: true conjunto ... ¿puede mostrar un ejemplo de código con la forma en que invoca createIndex? También debe probar dropDups: 1, ya que MongoDB trata erróneamente 1 y true de manera diferente en este contexto (consulte https://jira.mongodb.org/browse/SERVER-4562).

+0

bueno, creo que este es realmente el caso. dropDups funciona desde mongo shell, falló desde el panel de administración de mongorock. Leí el documento erlang bson que dice: "Atención, una cadena() se interpretará como una matriz de enteros. Debe suministrar cadenas como binario utf8, ver a continuación." - en este caso no puedo guardar mi email_id como cadenas, ya que quiero que el campo email_id sea único como cadena completa, no por carácter Cansado Esto es realmente desordenado, que creo que proviene del controlador erlang mongodb, si paso mi campo email_id como un átomo, se conserva como una cadena completa n no una matriz sabia como la anterior. –

+1

Ah, ya veo. ¿Entonces estas son cadenas que están codificadas erróneamente como matrices de números enteros? En ese caso, debe asegurarse de hacer lo que los documentos recomiendan sobre el binario UTF8 para que se guarden como cadenas en MongoDB. Además, ¿qué driver estás usando? – dcrosta

+0

estoy usando erlang mongodb driver por tony (https://github.com/TonyGen/mongodb-erlang) ... de hecho todo lo que uno necesita hacer es pasar cadenas como binarios utf8 si se deben guardar como cadenas ... si aprobadas como listas erlang, se almacenarán como se muestra arriba en fragmentos, lo que generará errores únicos de creación de claves. Creo que esta pregunta se puede marcar como cercana. Se trataba más de leer los documentos con cuidado y pasar cadenas como binarios utf8 –

0

Para otros que tengan este problema, verifique su versión de mongo con db.version(). Si está ejecutando Mongo 3 y está tratando de usar dropDups para eliminar duplicados, fallará y le dará este error.

Cuestiones relacionadas