2015-06-19 421 views
3

我想批量更新mongoengine文檔實例中的更改,但據我瞭解,model.objects.update(...)在符合條件的所有文檔中都會生成相同更新Mongoengine批量更新without objects.update()

例子:

entities = Foo.objects 

result = entities.update(
    set__foo='new bar', 
    upsert=True, 
    full_result=True) 

這將在具有其foo等於bar所有文件的屬性foonew bar。我想對每個文件做不同更改

這可能嗎?事情是這樣的:

entities = Foo.objects 

... # make changes to each entity in entities 

entities = Foo.objects.update(entities) 
# these entities were bulk updated in mongodb. 

回答

11

就回來這裏,萬一有人碰上這樣的:mongoengine並沒有真正給我們任何方式批量不同的更新了很多記錄,但pymongo呢!有了它,我可以很容易地編寫一個更新:

from pymongo import UpdateOne 
from mongoengine import Document, ValidationError 

class Foo(Document): 
    ... 

bulk_operations = [] 

for entity in entities: 
    try: 
     entity.validate() 
     bulk_operations.append(
      UpdateOne({'_id': entity.id}, {'$set': entity.to_mongo().to_dict()})) 

    except ValidationError: 
     pass 

if bulk_operations: 
    collection = Foo._get_collection() \ 
     .bulk_write(bulk_operations, ordered=False) 

在這裏,我得到Foo的收集與_get_collection()和執行UpdateOne操作列表 - 更新,因爲他們建造的。