E11000 erreur de clé en double index: MongoDb d'erreur inhabituels
J'ai un simple "utilisateurs" de la collection de l'intérieur qui en ce moment je n'ai que 2 documents.
{
"_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,
maintenant, si j'essaie de créer un nouvel index avec {unique: true} sur email_id champ, mongodb plaintes m' "E11000 erreur de clé en double index: db.utilisateurs.$email_id dup clé: { : 46 }". J'obtiens la même erreur, même après la spécification {dropDups: true}, mais je ne pense pas que ce soit le cas ici, à la fois comme document de différents id de courrier électronique est stocké.
Je ne suis pas sûr de ce qui se passe ici, tous les pointeurs seront grandement appréciés.
Edit: vue Complète de documents:
{
"_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
}
}
et
{
"_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
}
}
Il ya un couple de plus de champs comme "display_name", "registered_since", etc que j'ai omis de l'écran, au-dessus (je ne pense pas qu'ils ont un rôle dans l'erreur renvoyée, si vous avez encore besoin d'eux, je peux sans doute coller l'intégralité des documents ici)
Je suis en utilisant erlang mongodb pilote pour la communication avec mon mongo instance. Tous les champs peuvent être vues sont enregistrées sous la forme d'octets binaires, c'est pourquoi vous voyez ces étranges email_id dans le document.
Note: Binaire octet de format n'est pas forcé par ma logique de code, j'ai beaucoup passer chaîne email_id à l'intérieur de mon bfils documents, mais j'ai toujours vu mes données sous forme binaire octets. (Probablement parce que la façon dont erlang mongodb pilote est écrit, je n'ai pas vraiment d'enquêter sur ce, depuis mon find(), find_one() et d'autres requêtes fonctionne comme prévu, même avec les champs enregistrés sous forme de fichiers binaires octets)
Edit: > db.les utilisateurs.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" : [ ]
}
Pourquoi votre e-mail semble si étrange?
vérifiez les autres documents...
Vous avez besoin de fournir plus d'informations. Il semble que les documents que vous avez fournies sont incomplètes? Est-ce que "email_id' ont plus que 3 éléments? Peut-être l'élément 46 est dupliqué dans les deux documents? Quand/comment êtes-vous l'ajout d'un index? Est-ce dans un script ou dans le shell mongo? @Sergei Tulentsev dit, vous devez fournir une vue complète des documents. Et le plus petit ensemble de code que vous pouvez qui reproduit le problème.
Pouvez-vous coller la sortie de
db.users.findOne()
depuis le shell mongo? Je ne sais pas encore si Mongo est le traitement de ces sous forme de tableaux ou de sous-documents.
OriginalL'auteur Abhinav Singh | 2011-12-26
Vous devez vous connecter pour publier un commentaire.
Quand MongoDB indices d'un tableau de champ, il en fait des indices de l'individu éléments dans le tableau. C'est pour soutenir efficacement les requêtes à la recherche d'un élément particulier d'un tableau, comme:
Depuis cette
email_id
(46) existe dans les deux documents, il y a des doubles de clés dans votre index unique.Je ne sais pas pourquoi vous obtenez ce message d'erreur si vous avez
dropDups: true
ensemble... pouvez-vous montrer un exemple de code avec la façon dont vous êtes en invoquantcreateIndex
? Vous devriez également essayer dedropDups: 1
, comme MongoDB, à tort, traite1
ettrue
différemment dans ce contexte (voir https://jira.mongodb.org/browse/SERVER-4562).Ah, je vois. Donc, ce sont en fait des chaînes de caractères qui sont mal encodé sous la forme de tableaux d'entiers? Dans ce cas, vous devriez être sûr de faire ce que les docs sont en recommandant concernant UTF8 binaire, de sorte qu'ils sont enregistrés comme des chaînes de caractères dans MongoDB. Aussi, le pilote qui vous aide?
je suis à l'aide de erlang mongodb pilote par tony (github.com/TonyGen/mongodb-erlang) ... en effet tout ce qu'on doit faire est de passer des chaînes comme utf8 binaires si ils doivent être enregistrés comme des chaînes de caractères ... si elle est adoptée comme erlang listes, ils seront stockés comme indiqué ci-dessus dans des extraits de code, ce qui conduira à clé unique des erreurs de création. Je pense que cette question peut être marqué comme proches. Il n'était plus sur la lecture de la documentation soigneusement, et de passer des chaînes comme utf8 binaires
OK. Je ne sais pas beaucoup sur Erlang, mais il semble que vous ayez à utiliser le
utf()
fonction pour convertir votre chaîne à une chaîne UTF-8 pour le stockage dans MongoDB, sinon le pilote de la stocker dans un tableau de points de code (c'est à dire ints). Une fois que vous faites cela, il sera une valeur scalaire, pas un tableau, à mongo et vous serez en mesure d'ajouter votre index unique.Grâce every1, juste pour une mise à jour, si vous utilisez erlang + mongodb, assurez-vous simplement que tous les documents clés sont enregistrés comme erlang binaire terme, de sorte que mongodb les ramasser comme mentionné dans leurs docs. Aussi c'est une bonne (recommandé) pratique pour passer erlang les messages et les params en binaire (entre les procs) où vous pouvez (éventuellement toujours)...
OriginalL'auteur dcrosta
Pour les autres qui ont ce problème, vérifiez que votre mongo version avec
db.version()
. Si vous exécutez Mongo 3 et essayez d'utiliser dropDups pour effacer les doublons, il échouera et vous donner cette erreur.OriginalL'auteur Muhd