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

Come continuare l'inserimento dopo un errore di chiave duplicata utilizzando PyMongo

Devi usare insert_many metodo e imposta l'opzione ordinata su False .

db_stock.insert_many(<list of documents>)

Come menzionato nell'ordinato documentazione dell'opzione:

ordinato (opzionale):Se True (l'impostazione predefinita) i documenti verranno inseriti sul server in serie, nell'ordine fornito. Se si verifica un errore, tutti gli inserimenti rimanenti vengono annullati. Se False, i documenti verranno inseriti nel server in ordine arbitrario, possibilmente in parallelo, e verranno tentati tutti gli inserimenti di documenti.

Ciò significa che l'inserimento continuerà anche se si verifica un errore di chiave duplicata.

Demo:

>>> 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}]

Come puoi vedere, documenta con _id 4, 5 sono stati inseriti nella collezione.

Vale la pena notare che questo è possibile anche nella shell usando insertMany metodo. Tutto ciò di cui hai bisogno è impostare l'opzione non documentata ordered a false .

db.collection.insertMany(
    [ 
        { '_id': 2 }, 
        { '_id': 3 },
        { '_id': 4 }, 
        { '_id': 5 }
    ],
    { 'ordered': false }
)