【发布时间】:2020-08-31 19:09:02
【问题描述】:
我有一个非常大的 MongoDB 文档,因此需要几秒钟来保存。其中一个字段是嵌入文档的列表。当我更新列表中的一项并希望保存到数据库时,我希望能够只保存特定的嵌入文档而不是整个文档。
我的代码的一个缩写部分如下:
class Paragraph(mongoengine.EmbeddedDocument):
_id = mongoengine.ObjectIdField(required=True, default=lambda: ObjectId())
text = mongoengine.StringField()
updated = mongoengine.BooleanField()
class Contract(mongoengine.Document):
paragraphs = mongoengine.ListField(mongoengine.EmbeddedDocumentField(Paragraph))
def save(self, **kwargs):
if kwargs.get('update_only', False):
super(Contract, self).update(set__paragraphs=self.paragraphs)
else:
super(Contract, self).save(**kwargs)
所以这段代码允许我只保存Contract 文档中的paragraphs 字段,这已经比保存整个文档高效多了。但是,这仍然需要一段时间,因为文档中有很多段落。
我将属性updated 添加到Paragraph。我希望能够只保存那些标记为已更新的段落。
我找到了一种方法,首先从数据库中删除所有更新的段落,然后添加新的段落。
Contract.objects(id=id).update_one(pull__paragraphs={'_id': id_of_updated_paragraph})
Contract.objects(id=id).update_one(add_to_set__paragraphs=updated_paragraph)
这仍然感觉非常低效。有没有更好的方法来做到这一点?
【问题讨论】:
标签: python-3.x mongodb mongoengine