MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como continuar a inserção após erro de chave duplicada usando o PyMongo


Você precisa usar insert_many e defina a opção ordenada como False .
db_stock.insert_many(<list of documents>)

Conforme mencionado no encomendado documentação da opção:

encomendado (opcional):Se True (o padrão) os documentos serão inseridos no servidor serialmente, na ordem fornecida. Se ocorrer um erro, todas as inserções restantes serão abortadas. Se False, os documentos serão inseridos no servidor em ordem arbitrária, possivelmente em paralelo, e todas as inserções de documentos serão tentadas.

O que significa que a inserção continuará mesmo se houver um erro de chave duplicada.

Demonstração:
>>> c.insert_many([{'_id': 2}, {'_id': 3}])
<pymongo.results.InsertManyResult object at 0x7f5ca669ef30>
>>> list(c.find())
[{'_id': 2}, {'_id': 3}]
>>> try:
...     c.insert_many([{'_id': 2}, {'_id': 3}, {'_id': 4}, {'_id': 5}], ordered=False)
... except pymongo.errors.BulkWriteError:
...     list(c.find())
... 
[{'_id': 2}, {'_id': 3}, {'_id': 4}, {'_id': 5}]

Como você pode ver documento com _id 4, 5 foram inseridos na coleção.

Vale a pena notar que isso também é possível no shell usando o insertMany método. Tudo que você precisa é definir a opção não documentada ordered para false .
db.collection.insertMany(
    [ 
        { '_id': 2 }, 
        { '_id': 3 },
        { '_id': 4 }, 
        { '_id': 5 }
    ],
    { 'ordered': false }
)