作者:惯性hold不住 | 来源:互联网 | 2023-01-30 19:19
当使用带有pymongo的insert_many时,我需要忽略重复插入,其中重复项基于索引.我已经在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"......
谢谢
1> Neil Lunn..:
您可以通过检查生成的错误来处理此问题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"
这为您提供了一种忽略重复键错误的机制,但当然要注意实际上存在问题的东西.
@vgoklani它有点隐藏,甚至没有真正记录:(所以即使我"知道它在某处",我甚至不得不去挖掘它.因此,自我上次评论以来的延迟.