当前位置: 首页 > 面试题库 >

如何使用insert_many安全地忽略重复的键错误

殳睿
2023-03-14
问题内容

当将insert_many与pymongo一起使用时,我需要忽略重复的插入,其中重复是基于索引的。我已经看到有关stackoverflow的问题,但是我没有看到有用的答案。

这是我的代码段:

try:
    results = mongo_connection[db][collection].insert_many(documents, ordered=False, bypass_document_validation=True)
except pymongo.errors.BulkWriteError as e:
    logger.error(e)

我希望insert_many忽略重复项而不抛出异常(这会填满我的错误日志)。另外,是否可以使用一个单独的异常处理程序,这样我就可以忽略这些错误。我想念“ w
= 0” …

谢谢


问题答案:

您可以通过检查产生的错误来解决此问题BulkWriteError。这实际上是一个具有多个属性的“对象”。有趣的部分在details

import pymongo
from bson.json_util import dumps
from pymongo import MongoClient
client = MongoClient()
db = client.test

collection = db.duptest

docs = [{ '_id': 1 }, { '_id': 1 },{ '_id': 2 }]


try:
  result = collection.insert_many(docs,ordered=False)

except pymongo.errors.BulkWriteError as e:
  print e.details['writeErrors']

首次运行时,这将列出以下错误e.details['writeErrors']

[
  { 
    'index': 1,
    'code': 11000, 
    'errmsg': u'E11000 duplicate key error collection: test.duptest index: _id_ dup key: { : 1 }', 
    'op': {'_id': 1}
  }
]

在第二次运行中,您会看到三个错误,因为所有项目都存在:

[
  {
    "index": 0,
    "code": 11000,
    "errmsg": "E11000 duplicate key error collection: test.duptest index: _id_ dup key: { : 1 }", 
    "op": {"_id": 1}
   }, 
   {
     "index": 1,
     "code": 11000,
     "errmsg": "E11000 duplicate key error collection: test.duptest index: _id_ dup key: { : 1 }",
     "op": {"_id": 1}
   },
   {
     "index": 2,
     "code": 11000,
     "errmsg": "E11000 duplicate key error collection: test.duptest index: _id_ dup key: { : 2 }",
     "op": {"_id": 2}
   }
]

因此,您所需要做的就是过滤数组中的条目,"code": 11000然后在其中有其他内容时仅“恐慌”

panic = filter(lambda x: x['code'] != 11000, e.details['writeErrors'])

if len(panic) > 0:
  print "really panic"

这为您提供了一种机制,可以忽略重复的键错误,但是当然要注意一些实际存在的问题。



 类似资料:
  • 问题内容: 这个问题已经在这里有了答案 : “ INSERT IGNORE”与“ INSERT…ON DUPLICATE KEY UPDATE” (11个答案) 6年前关闭。 我正在尝试完成此查询;我的标签字段设置为UNIQUE,我只是希望数据库忽略任何重复的标签。 甚至可以接受 问题答案: 建议不要使用INSERT IGNORE,因为它会忽略所有错误(即,草率的全局忽略)。相反,由于在您的示例中

  • 我希望用同一行中其他列的相关值更新列。我正在更新的列是唯一的,如果执行此操作,我有时会出现重复的键错误。我希望忽略这些错误,只更新其中一条记录,忽略其他记录。 我的查询如下所示: 现在,在Fname和Lname两行匹配的情况下,我只希望更新第一个记录Coolname。 谢谢(MS SQL Server)

  • 我目前使用JOOQ的可更新记录如下模式插入: 在,我希望使用数据库中的值更新,例如,如果表具有自动递增的列,将返回其值。 如果列具有唯一约束,则当违反该约束时,将抛出。我的问题是可以告诉JOOQ不要抛出异常,但仍然用现有的值更新记录吗?

  • 问题内容: 当重复发生时,我得到重复键异常。 发生重复时,是否可以忽略添加要映射的值? 当有重复项时,只需忽略该重复项即可继续。 问题答案: 使用以下参数可以实现Collectors.toMap(keyMapper, valueMapper, mergeFunction): 是对与同一个键关联的两个值进行运算的函数。对应于收集元素时遇到的第一个地址,也对应于遇到的第二个地址:此lambda只是告知

  • 我试图在wildfly上保护一个演示web应用程序。我已经在单机版中定义了这个安全域。xml 然后在web-inf下,我在web.xml中定义了这个安全约束 以及jboss网站上的这些内容。xml 问题是,如果我转到/projects URL,我不会重定向到登录页面,就好像忽略了约束一样。

  • 问题内容: 我在另一个问题(> 如何在Java中同时处理按键?)的注释部分提出了这个问题,并被要求提出一个新问题。 我的问题是,当用户按下按键时,当我创建按键列表ArrayList时,不会通过keyReleased事件足够快地将其删除。我希望运动与“ asdf”和北,东,南,西,东北…等保持一致。 这是我的两个事件的代码: 直到我通过lastKey(String)变量将第二个检查添加到那里,金字塔