获得;“呃”&引用;E11000使用Java驱动程序插入mongo时出现重复密钥错误

获得;“呃”&引用;E11000使用Java驱动程序插入mongo时出现重复密钥错误,java,mongodb,twitter4j,Java,Mongodb,Twitter4j,线程“main”com.mongodb.MongoException$DuplicateKey中出现异常:{ “serverUsed”:“localhost/127.0.0.1:27017”,“err”:“E11000重复 键错误索引:twitterdb03.LevelAFollowers.$id dup键:{: ObjectId('52d5636de408652b4853a8fe'),“代码”:11000,“n”:0, “connectionId”:12,“ok”:1.0} 我正在使用Mong

线程“main”com.mongodb.MongoException$DuplicateKey中出现异常:{ “serverUsed”:“localhost/127.0.0.1:27017”,“err”:“E11000重复 键错误索引:twitterdb03.LevelAFollowers.$id dup键:{: ObjectId('52d5636de408652b4853a8fe'),“代码”:11000,“n”:0, “connectionId”:12,“ok”:1.0}

我正在使用Mongo2.11.1

java中的简单写操作从未出现过问题

myMap.put(inid, followersList);
myObj.putAll(myMap);
myIdMapCollection.insert(myObj);

尝试调用
myIdMapCollection.save(myObj)而不是
myIdMapCollection.insert(myObj)

save
方法不同于
insert
方法,它会向上插入,这意味着如果文档包含
\u id
,它会替换该文档

我的猜测是,您使用游标查询获取了
DBObject
,并对其进行了操作,您希望保留更改。在这种情况下,
save
是正确的方法

因此,当调用
insert
时,
DBObject
已经与
\u id
关联,调用
insert
因此失败,因为集合中已经有一个具有该
\u id
的文档,该文档应该是唯一的(重复索引错误)

我找到了答案。我猜您的代码看起来像这样(大大简化了)?:

问题是,如果
\u id
字段不存在,PyMongo在插入它之前会将一个_id字段注入文档中(
\u id
总是在客户端使用10gen驱动程序生成)。这意味着第一次通过循环
\u id
是通过insert方法添加的。由于
doc
是在循环外部定义的,因此每个后续通过循环的过程对
\u id
使用相同的值

解决方案:

  • 删除密钥id
  • 或手动创建一个新的:

  • 终于成功了,谢谢你在这里耽搁了2天。我也有同样的问题!但是用,保存不好!!但我的重复键在我手动创建的索引中,而不是在_id上。是这样还是这样?如果是,我如何处理这个问题?谢谢,最后是一个有用且简单的解决方案。
    doc = {} 
    for i in xrange(2): 
        doc['i'] = i 
        collection.insert(doc) 
    
    for i in xrange(2): 
        doc['i'] = i 
        if '_id' in doc: 
            del doc['_id'] 
        collection.insert(doc)
    
    from bson.objectid import ObjectId 
    for i in xrange(2): 
        doc['i'] = i 
        doc['_id'] = ObjectId() 
        collection.insert(doc)