没有objects.update()的Mongoengine批量更新

时间:2015-06-19 16:34:52

标签: python pymongo mongoengine

我想批量更新mongoengine Documents'实例,但据我了解,model.objects.update(...)在符合条件的所有文档中进行相同更新

示例:

entities = Foo.objects

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

foo等于new bar的所有文档上,将属性foo设置为bar。我想对每个文档进行不同的更改

这可能吗?像这样:

entities = Foo.objects

...  # make changes to each entity in entities

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

1 个答案:

答案 0 :(得分:15)

回到这里,如果有人碰到这个: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)

在这里,我使用_get_collection()获取Foo的集合并执行UpdateOne操作列表 - 更新,因为它们已构建。