sql >> Databáze >  >> NoSQL >> MongoDB

Jak bezpečně ignorovat chyby duplicitních klíčů pomocí insert_many

S tím se můžete vypořádat kontrolou chyb vytvořených pomocí BulkWriteError . Jedná se vlastně o „objekt“, který má několik vlastností. Zajímavé části jsou v 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']

Při prvním spuštění se zobrazí seznam chyb 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}
  }
]

Při druhém spuštění uvidíte tři chyby, protože všechny položky existovaly:

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

Takže vše, co musíte udělat, je filtrovat pole pro položky s "code": 11000 a pak jen "panikařit", když je tam něco jiného

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

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

To vám dává mechanismus, jak ignorovat duplicitní klíčové chyby, ale samozřejmě věnovat pozornost něčemu, co je ve skutečnosti problém.



  1. Mongodb/mongoose insert není funkce

  2. Jak vytvořit místní servisní sběrnici založenou na Windows mimo Azure, podobnou Redis s automatickým převzetím služeb při selhání?

  3. Vrátí skutečný typ pole v MongoDB

  4. mongodb jak získat maximální hodnotu z kolekcí