获取“错误”:“使用Java驱动程序插入mongo时出现E11000重复键错误

时间:2014-01-14 17:26:35

标签: java mongodb twitter4j

  

线程“main”中的异常com.mongodb.MongoException $ DuplicateKey:{   “serverUsed”:“localhost / 127.0.0.1:27017”,“错误”:“E11000重复   密钥错误索引:twitterdb03.LevelAFollowers。$ id dup key:{:   ObjectId('52d5636de408652b4853a8fe')}“,”code“:11000,”n“:0,   “connectionId”:12,“ok”:1.0}

我正在使用mongo 2.11.1

从未遇到过java中简单写操作的问题

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

2 个答案:

答案 0 :(得分:22)

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

doc = {} 
for i in xrange(2): 
    doc['i'] = i 
    collection.insert(doc) 

问题是PyMongo在文档中注入_id字段,如果_id字段不存在,则在插入之前(_id始终生成客户端10gen司机)。这意味着第一次通过循环_id由insert方法添加。由于doc是在循环外定义的,因此每个后续循环都使用_id相同值。

解决方案:

  1. 删除键_id
  2. for i in xrange(2): 
        doc['i'] = i 
        if '_id' in doc: 
            del doc['_id'] 
        collection.insert(doc)
    
    1. 或手动创建一个新的:
    2. from bson.objectid import ObjectId 
      for i in xrange(2): 
          doc['i'] = i 
          doc['_id'] = ObjectId() 
          collection.insert(doc)
      

答案 1 :(得分:7)

尝试拨打myIdMapCollection.save(myObj);而不是myIdMapCollection.insert(myObj);

save不同,insert方法会进行upsert,这意味着如果文档包含_id,则会替换该文档。

我的猜测是你使用游标|获取了DBObject查询,操纵它,并且您想要保留更改。在这种情况下,save是正确的方法。

因此,在调用insert时,DBObject已与_id相关联,因此调用insert失败,因为您已经拥有_id的文档在集合中,它应该是唯一的(重复索引错误)。

相关问题