E11000重复键错误索引:MongoDb异常错误

时间:2011-12-26 21:25:57

标签: mongodb erlang

我有一个简单的"用户"现在我只收集了2份文件。

{
    "_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字段上使用{unique:true}创建一个新索引,mongodb会向我投诉" E11000重复键错误索引:db.users。$ email_id dup key:{:46}& #34 ;.即使在指定{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" : [ ]
}

2 个答案:

答案 0 :(得分:5)

当MongoDB索引数组字段时,它实际上索引数组中的各个元素。这是为了有效地支持查找数组的特定元素的查询,例如:

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

由于这两个文档中都存在email_id(46),因此您的唯一索引中存在重复的键。

如果您设置了dropDups: true,我不确定为什么会出现此错误...您是否可以使用createIndex的方式显示代码示例?您还应该尝试dropDups: 1,因为MongoDB在此上下文中错误地对待1true(请参阅https://jira.mongodb.org/browse/SERVER-4562)。

答案 1 :(得分:0)

对于遇到此问题的其他人,请使用db.version()检查您的mongo版本。如果你正在运行Mongo 3并且正在尝试使用dropDups来清除重复项,它将失败并给你这个错误。