Musisz użyć insert_many
metody i ustaw zamówioną opcję na False
.
db_stock.insert_many(<list of documents>)
Jak wspomniano w zamówieniu dokumentacja opcji:
zamówione (opcjonalnie):Jeśli True (domyślnie) dokumenty będą umieszczane na serwerze szeregowo, w podanej kolejności. Jeśli wystąpi błąd, wszystkie pozostałe wkładki zostaną przerwane. Jeśli False, dokumenty zostaną wstawione na serwer w dowolnej kolejności, prawdopodobnie równolegle, a wszystkie dokumenty zostaną wstawione.
Co oznacza, że wstawianie będzie kontynuowane, nawet jeśli wystąpi błąd zduplikowanego klucza.
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}]
Jak widać dokument z _id
4, 5 zostały dodane do kolekcji.
Warto zauważyć, że jest to również możliwe w powłoce za pomocą insertMany
metoda. Wystarczy ustawić nieudokumentowaną opcję ordered
na false
.
db.collection.insertMany(
[
{ '_id': 2 },
{ '_id': 3 },
{ '_id': 4 },
{ '_id': 5 }
],
{ 'ordered': false }
)