我使用insert_many
,我需要发送一份文件清单,并知道哪些文件是重复的。
我的代码引发了DuplicateKeyError,我想知道错误中是否有任何字段向我显示未插入的_id。
这是我的代码
try:
result = yield collection.insert_many(content, ordered=False)
except DuplicateKeyError as e:
print (e)
回溯
E11000重复键错误索引:test.user。$ id dup key:{:" 4" }
答案 0 :(得分:1)
要检查的实际错误应该是BulkWriteError
。这可能包含比“Duplicate Key Error”更多的错误,但当然您总是可以通过错误代码过滤结果。
作为一个简单示例(因为返回的类不依赖于异步API用法):
try:
result = db.testme.insert_many([
{ "_id": 1 },
{ "_id": 2 },
{ "_id": 1 },
{ "_id": 3 },
{ "_id": 2},
{ "_id": [1] }
],ordered=False)
except BulkWriteError as e:
pprint([err for err in e.details['writeErrors'] if err['code'] == 11000])
这将返回重复键错误和源列表中的索引位置:
[{u'code': 11000,
u'errmsg': u'E11000 duplicate key error collection: test.testme index: _id_ dup key: { : 1 }',
u'index': 2,
u'op': {'_id': 1}},
{u'code': 11000,
u'errmsg': u'E11000 duplicate key error collection: test.testme index: _id_ dup key: { : 2 }',
u'index': 4,
u'op': {'_id': 2}}]
当然其他错误是因为尝试将“数组”分配给_id
字段,这是不允许的,但也不是重复键错误,因此我们对其进行了过滤:
{u'code': 2,
u'errmsg': u"can't use an array for _id",
u'index': 5,
u'op': {'_id': [1]}}]