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" : [ ]
}
当MongoDB的索引的阵列字段,它实际上索引阵列中的单个元件。这是为了有效地支持查询,寻找一个数组的特定元素,比如:
db.users.find({email_id: 46})
由于这email_id
(46)存在于两个文件,也有你的唯一索引重复键。
我不确定为什么你会得到这个错误,如果你有dropDups: true
设置...你可以显示一个代码示例与你如何调用createIndex
?您还应该尝试dropDups: 1
,因为MongoDB在此上下文中错误地将1
和true
视为不同(请参阅https://jira.mongodb.org/browse/SERVER-4562)。
我认为这的确是这样的情况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
啊,我明白了。所以这些实际上是错误编码为整数数组的字符串?在这种情况下,您应该确保文档正在推荐关于UTF8二进制文件的内容,以便它们在MongoDB中保存为字符串。另外,你正在使用哪个驱动程序? – dcrosta 2011-12-28 12:34:40
我使用的是由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来清除重复项,它将会失败,并为您提供此错误。
向我们展示完整文档。 – 2011-12-26 21:28:37
为什么你的电子邮件看起来很奇怪? – 2011-12-26 21:29:13
检查其他文档... – 2011-12-26 21:51:06