得到“错误”:“使用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使用相同的值。

解:

  1. 删除键_id
 for i in xrange(2): doc['i'] = i if '_id' in doc: del doc['_id'] collection.insert(doc) 
  1. 或手动创建一个新的:
 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是正确的方法。

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