【问题标题】:Getting "err" : "E11000 duplicate key error when inserting into mongo using the Java driver获取“错误”:“使用 Java 驱动程序插入 mongodb 时出现 E11000 重复键错误
【发布时间】:2014-02-02 21:20:41
【问题描述】:

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

我正在使用 mongo 2.11.1

在java中简单的写操作从来没有遇到过问题

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

【问题讨论】:

    标签: java mongodb twitter4j


    【解决方案1】:

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

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

    问题在于 PyMongo 会在文档中注入一个 _id 字段,如果 _id 字段不存在,然后再插入它(_id 总是使用 10gen 驱动程序生成客户端)。这意味着第一次通过循环 _id 是由 insert 方法添加的。由于doc 是在循环外定义的,因此每次后续循环都使用_idsame 值。

    解决方案:

    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)
    

    【讨论】:

    • 谢谢,终于有了一个有用且简单的解决方案。
    【解决方案2】:

    尝试调用myIdMapCollection.save(myObj); 而不是myIdMapCollection.insert(myObj);

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

    我的猜测是您使用游标获取了DBObject |查询,已对其进行了操作,并且您希望保留更改。在这种情况下,save 是正确的做法。

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

    【讨论】:

    • 终于成功了,谢谢在这耽误了2天
    • 我也有同样的问题!但是使用 .save 并不能解决问题!
    • 但我的重复键在我手动创建的索引中,而不是在 _id 上。是它还是这个目的?如果是,我该如何解决这个问题?
    猜你喜欢
    • 1970-01-01
    • 2017-02-20
    • 2018-10-12
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 2013-04-14
    相关资源
    最近更新 更多