MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Cách bỏ qua lỗi khóa trùng lặp một cách an toàn bằng insert_many

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 đề.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cách thích hợp để nhập tệp json vào mongo

  2. Nhận _id của một tài liệu được chèn trong MongoDB?

  3. Tối ưu hóa truy vấn MongoDB

  4. MongoDB:Làm thế nào để tìm hiểu xem một trường mảng có chứa một phần tử không?

  5. Bộ lọc mảng Mongodb 3.6.0-rc3 không hoạt động?