MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как безопасно да игнорирате дублиращи се ключови грешки, като използвате insert_many

Можете да се справите с това, като проверите грешките, произведени с 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"

Това ви дава механизъм за игнориране на дублиращите се ключови грешки, но разбира се да обръщате внимание на нещо, което всъщност е проблем.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. JSON.NET грешка при предаване при сериализиране на Mongo ObjectId

  2. Компресиране на индексен префикс в MongoDB 3.0 WiredTiger

  3. MongoDB / Pymongo заявка с дата и час

  4. Не мога да се свържа с MongoDB Atlas (queryTxt ETIMEOUT)

  5. Преглед на Percona Backup за MongoDB