sql >> Database >  >> NoSQL >> MongoDB

Hoe u dubbele sleutelfouten veilig kunt negeren met insert_many

U kunt dit oplossen door de fouten te inspecteren die zijn geproduceerd met BulkWriteError . Dit is eigenlijk een "object" dat meerdere eigenschappen heeft. De interessante delen staan ​​in 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']

Bij de eerste keer uitvoeren geeft dit de lijst met fouten onder e.details['writeErrors'] :

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

Bij een tweede run zie je drie fouten omdat alle items bestonden:

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

Dus alles wat je hoeft te doen is de array filteren op items met "code": 11000 en dan pas "paniek" als er iets anders in zit

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

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

Dat geeft je een mechanisme om de dubbele sleutelfouten te negeren, maar natuurlijk aandacht te schenken aan iets dat eigenlijk een probleem is.



  1. Controleer of redis actief is -> node js

  2. How-to:gebruik de HBase Thrift-interface, deel 1

  3. MapVerminder schuifelen en sorteren in Hadoop

  4. Groeperen op specifiek element van array met mongo-aggregatieframework