Bạn có thể giải quyết vấn đề này bằng cách kiểm tra các lỗi được tạo ra với BulkWriteError
. Đây thực sự là một "đối tượng" có một số thuộc tính. Các phần thú vị có trong 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']
Trong lần chạy đầu tiên, điều này sẽ cung cấp danh sách các lỗi trong e.details['writeErrors']
:
[
{
'index': 1,
'code': 11000,
'errmsg': u'E11000 duplicate key error collection: test.duptest index: _id_ dup key: { : 1 }',
'op': {'_id': 1}
}
]
Trong lần chạy thứ hai, bạn thấy ba lỗi vì tất cả các mục đều tồn tại:
[
{
"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}
}
]
Vì vậy, tất cả những gì bạn cần làm là lọc mảng cho các mục nhập có "code": 11000
và sau đó chỉ "hoảng sợ" khi có thứ gì đó khác ở trong đó
panic = filter(lambda x: x['code'] != 11000, e.details['writeErrors'])
if len(panic) > 0:
print "really panic"
Điều đó cung cấp cho bạn một cơ chế để bỏ qua các lỗi chính trùng lặp nhưng tất nhiên là chú ý đến một thứ thực sự là một vấn đề.