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

Nau*_*s_o 11 java mongodb twitter4j

线程"main"中的异常com.mongodb.MongoException $ DuplicateKey:{"serverUsed":"localhost/127.0.0.1:27017","err":"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);
Run Code Online (Sandbox Code Playgroud)

Flo*_*ian 22

在这个页面上找到了答案.我猜你的代码看起来像这样(大大简化)?:

doc = {} 
for i in xrange(2): 
    doc['i'] = i 
    collection.insert(doc) 
Run Code Online (Sandbox Code Playgroud)

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

解:

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


Ori*_*Dar 7

试着打电话myIdMapCollection.save(myObj);而不是myIdMapCollection.insert(myObj);

save方法与insertupsert 不同,意味着如果文档包含_id,则替换该文档.

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

所以,当调用insertDBObject已经与相关的_id,称insert这样失败了,因为你已经有一个文档_id的集合,它应该是唯一的(重复的索引错误).