E11000重复键错误指数:MongoDb异常错误

问题描述:

我有一个简单的“用户”集合里面,现在我只有2个文件。E11000重复键错误指数: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, 

现在,如果我尝试创建一个新的指数{独特:真正}上EMAIL_ID场,MongoDB的投诉我“E11000重复键错误指数:db.users $ EMAIL_ID DUP键:{46} ”。即使在指定{dropDups:true}后,我也会得到相同的错误,但是我不认为这是这种情况,因为两个文档都存储有不同的电子邮件ID。

我不确定这里发生了什么,任何指针将不胜感激。

编辑:证件的完整视图:

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

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

有一对夫妇更喜欢 “DISPLAY_NAME”, “registered_since” 等领域我从省略上面的显示(我不认为他们在抛出的错误中有任何作用,如果你仍然需要它们,我可以在这里粘贴整个文档)

我正在使用erlang mongodb driver与我的mongo实例进行通信。所有可以看到的字段都保存为二进制字节,这就是为什么你在文档中看到这样奇怪的email_id。

注:二进制字节格式不被我的代码逻辑所迫,我非常通字符串我BSON文件里面EMAIL_ID,但我总是最后看到我的数据的二进制字节。 (可能是因为如何编写erlang mongodb驱动程序,因为我的find(),find_one()和其他查询按预期工作,即使字段保存为二进制字节也没有调查)

编辑:> 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

向我们展示完整文档。 – 2011-12-26 21:28:37

+0

为什么你的电子邮件看起来很奇怪? – 2011-12-26 21:29:13

+0

检查其他文档... – 2011-12-26 21:51:06

当MongoDB的索引的阵列字段,它实际上索引阵列中的单个元件。这是为了有效地支持查询,寻找一个数组的特定元素,比如:

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

由于这email_id(46)存在于两个文件,也有你的唯一索引重复键。

我不确定为什么你会得到这个错误,如果你有dropDups: true设置...你可以显示一个代码示例与你如何调用createIndex?您还应该尝试dropDups: 1,因为MongoDB在此上下文中错误地将1true视为不同(请参阅https://jira.mongodb.org/browse/SERVER-4562)。

+0

我认为这的确是这样的情况dropDups从mongo shell工作,它从mongorock管理面板失败我读了erlang bson文档,它说: “注意,string()将被解释为一个整数数组,你必须提供字符串为utf8 binary,见下文。” - 在这种情况下,我无法将我的email_id保存为字符串,因为我希望email_id字段作为唯一字符串整个字符串,没有每个字符明智的唯一性要求红外发光二极管。这真是一团糟,我认为它来自erlang mongodb驱动程序,如果我将我的email_id字段作为原子传递,它将保留为完整字符串n,而不是像上面那样使用char明智数组。 – 2011-12-28 09:35:10

+1

啊,我明白了。所以这些实际上是错误编码为整数数组的字符串?在这种情况下,您应该确保文档正在推荐关于UTF8二进制文件的内容,以便它们在MongoDB中保存为字符串。另外,你正在使用哪个驱动程序? – dcrosta 2011-12-28 12:34:40

+0

我使用的是由tuony(https://github.com/TonyGen/mongodb-erlang)构建的erlang mongodb驱动程序......实际上,所有需要做的事情都是将字符串作为utf8二进制文件传递,如果它们必须保存为字符串... if作为erlang列表传递,它们将如上所示存储在片段中,这将导致唯一的密钥创建错误。我认为这个问题可以被标记为接近。它更关心的是仔细阅读文档,并将字符串作为utf8二进制文件 – 2011-12-29 07:05:28

对于有此问题的其他人,请检查您的mongo版本db.version()。如果您正在运行Mongo 3并试图使用dropDups来清除重复项,它将会失败,并为您提供此错误。