MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как да продължа вмъкването след грешка с дублиран ключ с помощта на PyMongo

Трябва да използвате 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 }
)


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. render_template с множество променливи

  2. Mongoose - използване на Populate върху масив от ObjectId

  3. Как да актуализирам частично обект в MongoDB, така че новият обект да се наслагва / слее със съществуващия

  4. Изключение, удостоверяващо MongoCredential и некатегоризирано Mongo Db Exception

  5. Кормило:Достъпът е отказан за разрешаване на свойството от, защото не е собствена собственост на своя родител