得到“错误”:“使用Java驱动程序插入mongo时出现E11000重复键错误
线程“main”中的exceptioncom.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);
我在这个页面上找到了答案。 我猜你的代码看起来像这样(大大简化)?:
doc = {} for i in xrange(2): doc['i'] = i collection.insert(doc)
问题是PyMongo在插入文件之前, 如果_id
字段不存在 , 则将 _id字段注入文档中( _id
始终是使用10gen驱动程序生成客户端的)。 这意味着第一次通过循环_id
由insert方法添加。 由于doc
是在循环外定义的,因此每次后续循环都会为_id
使用相同的值。
解:
- 删除键_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)
尝试调用myIdMapCollection.save(myObj);
而不是myIdMapCollection.insert(myObj);
与insert
不同, save
方法执行upsert,这意味着如果文档包含_id
,它将替换该文档。
我的猜测是你使用游标|获取了DBObject
查询,操纵它,并且您想要保留更改。 在这种情况下, save
是正确的方法。
因此,当调用insert
, DBObject
已经与_id
关联,因此调用insert
失败,因为您已经在集合中有一个带有该_id
的文档,该文档应该是唯一的(重复索引错误)。