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

Mongoengine bulk update without objects.update()

我想批量更新 mongoengine 文档实例中的更改,但据我了解,model.objects.update(...) 在所有匹配的文档中进行 相同的更新标准。

示例:

entities = Foo.objects

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

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

这可能吗?像这样:

entities = Foo.objects

...  # make changes to each entity in entities

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

刚回到这里,以防有人 运行 遇到这个问题: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 操作列表 - 更新,因为它们是构建的。