没有 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
操作列表 - 更新,因为它们是构建的。
我想批量更新 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
操作列表 - 更新,因为它们是构建的。