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