MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jak bezpiecznie zignorować zduplikowane błędy klucza za pomocą insert_many

Możesz sobie z tym poradzić, sprawdzając błędy generowane przez BulkWriteError . W rzeczywistości jest to „obiekt”, który ma kilka właściwości. Ciekawe części znajdują się w 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']

Przy pierwszym uruchomieniu da to listę błędów pod e.details['writeErrors'] :

[
  { 
    'index': 1,
    'code': 11000, 
    'errmsg': u'E11000 duplicate key error collection: test.duptest index: _id_ dup key: { : 1 }', 
    'op': {'_id': 1}
  }
]

Przy drugim uruchomieniu widzisz trzy błędy, ponieważ wszystkie elementy istniały:

[
  {
    "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}
   }
]

Wszystko, co musisz zrobić, to przefiltrować tablicę pod kątem wpisów z "code": 11000 a potem tylko "panika", gdy jest tam coś innego

panic = filter(lambda x: x['code'] != 11000, e.details['writeErrors'])

if len(panic) > 0:
  print "really panic"

Daje to mechanizm ignorowania błędów zduplikowanych kluczy, ale oczywiście zwracanie uwagi na coś, co w rzeczywistości jest problemem.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB 2.1 Aggregate Framework Sum of Array Elements pasujących do nazwy

  2. Jednostki używane dla maxdistance i MongoDB?

  3. Model.find().toArray() twierdzący, że nie ma metody .toArray()

  4. Obsługa transakcji w MongoDB

  5. Jak wypełnić dokument podrzędny w manguście po jego utworzeniu?