sql >> Database teknologi >  >> NoSQL >> MongoDB

Sådan ignoreres duplikatnøglefejl sikkert ved at bruge insert_many

Du kan håndtere dette ved at inspicere de fejl, der er produceret med BulkWriteError . Dette er faktisk et "objekt", som har flere egenskaber. De interessante dele er i 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']

Ved en første kørsel vil dette give listen over fejl under e.details['writeErrors'] :

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

Ved en anden kørsel ser du tre fejl, fordi alle elementer eksisterede:

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

Så alt hvad du skal gøre er at filtrere arrayet for poster med "code": 11000 og så kun "panik", når der er noget andet derinde

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

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

Det giver dig en mekanisme til at ignorere de duplikerede nøglefejl, men selvfølgelig være opmærksom på noget, der faktisk er et problem.



  1. .NET bedste praksis for MongoDB-forbindelser?

  2. Redis som Hibernate andet niveau cache

  3. Mongo:find genstande, der ikke har et bestemt felt

  4. Spring data mongodb søg efter ISO-dato