获取在pymongo中导致DuplicateKeyError的id

时间:2016-04-05 18:48:54

标签: python mongodb mongodb-query pymongo

我使用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" }

1 个答案:

答案 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]}}]