我想批量更新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.
答案 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
操作列表 - 更新,因为它们已构建。