线程“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);
答案 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
的相同值。
解决方案:
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)
答案 1 :(得分:7)
尝试拨打myIdMapCollection.save(myObj);
而不是myIdMapCollection.insert(myObj);
与save
不同,insert
方法会进行upsert,这意味着如果文档包含_id
,则会替换该文档。
我的猜测是你使用游标|获取了DBObject
查询,操纵它,并且您想要保留更改。在这种情况下,save
是正确的方法。
因此,在调用insert
时,DBObject
已与_id
相关联,因此调用insert
失败,因为您已经拥有_id
的文档在集合中,它应该是唯一的(重复索引错误)。