当前位置: 首页 > 知识库问答 >
问题:

获取“err”:“E11000使用Java驱动程序插入mongo时出现重复密钥错误”

陆弘光
2023-03-14

线程“main”com中出现异常。mongodb。MongoException$DuplicateKey:{“serverUsed”:“localhost/127.0.0.1:27017”,“err”:“E11000 duplicate key error index: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);

共有2个答案

郑正阳
2023-03-14

尝试调用myIdMapCollection。save(myObj) 而不是myIdMapCollection。插入(myObj)

与插入不同的是,保存方法会更新,这意味着如果文档包含_id,它会替换该文档。

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

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

梁宪
2023-03-14

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

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

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

解决方案:

  1. 删除密钥_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)
 类似资料:
  • 我在一个djs机器人工作,我遇到了一个错误,我不知道如何修复我已经看了https://docs.mongodb.com/manual/indexes/和NodeJs,摩卡和猫鼬,但似乎没有什么帮助这里是信息- 错误发生在这里- 这是我的服务器模型/服务器架构- 最后,这是我得到的错误-

  • 出于某种原因,我的应用程序不允许我创建多个配置文件。下面是服务文件中的设置: //这将查找配置文件(如果存在) //如果一个不存在的话,应该创建一个 它适用于第一个用户,但当我创建另一个用户时,我会得到错误:{“error”:{“message”:“MongoError:E11000重复键错误集合:TownMiner.profiles index:info.subs_1 dup key:{info

  • 下面是模型中的架构- 这就是我在控制器中使用它的方式- 我就是这样把它保存在数据库里的- 错误- 我检查了数据库集合,没有这样的重复条目存在,让我知道我做错了什么? FYI-和正在获取值。 我也检查了这篇文章,但没有帮助堆栈链接 如果我完全删除,它就插入文档,否则它会抛出错误“重复”错误,即使我在local.email中有一个条目

  • 在node.js,从一个javascript循环,我试图插入一个json对象到一个mongoDB集合,但得到重复的键错误_id列。 {MongoError:E11000重复密钥错误集合:app.Tab2017index:id dup-key:{:ObjectId('5cbc813227b2ca2864b3c66a')} 这是我的javascript代码的一部分,它导致了错误。 以上代码在控制台上显

  • 问题内容: 我有一个带有唯一主键列的表。有时,当我执行查询时会收到错误消息,因为该值已被使用。 我可以使用和捕获此特定错误吗? 问题答案: 看起来mysql为重复的主键抛出了1062错误代码。您可以检查sql异常的错误代码: 注意,这种方法不是跨数据库供应商的,因为不同的供应商对于重复的PK可能具有不同的错误代码。