Трябва да използвате insert_many
метод и задайте подредената опция на False
.
db_stock.insert_many(<list of documents>)
Както е посочено в поръчаното документация за опции:
поръчани (по избор):Ако е True (по подразбиране), документите ще бъдат вмъкнати на сървъра последователно, в предоставения ред. Ако възникне грешка, всички останали вмъквания се прекратяват. Ако е False, документите ще бъдат вмъкнати на сървъра в произволен ред, вероятно паралелно, и ще бъдат направени опити за вмъкване на всички документи.
Което означава, че вмъкването ще продължи дори ако има грешка с дублиран ключ.
Демо:
>>> 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}]
Както можете да видите документ с _id
4, 5 бяха вмъкнати в колекцията.
Струва си да се отбележи, че това е възможно и в обвивката с помощта на insertMany
метод. Всичко, от което се нуждаете, е да зададете недокументираната опция ordered
до false
.
db.collection.insertMany(
[
{ '_id': 2 },
{ '_id': 3 },
{ '_id': 4 },
{ '_id': 5 }
],
{ 'ordered': false }
)