当我使用mongoengine更新ListField时,它太慢了。这里是一个示例
class Post(Document):
_id = StringField()
txt = StringField()
comments = ListField(EmbeddedDocumentField(Comment))
class Comment(EmbeddedDocument):
comment = StringField()
...
...
position = 3000
_id = 3
update_comment_str = "example"
#query
post_obj = Post.objects(_id=str(_id)).first()
#update
post_obj.comments[position].comment = update_comment_str
#save
post_obj.save()
花费的时间随着post_obj.comments长度的增加而增加。 如何优化它?
答案 0 :(得分:1)
Post.objects(id=str(_id)).update(**{"comments__{}__comment".format(position): update_comment_str})
在您的代码中。
您已将整个文档提取到将在RAM中发生的python实例中。
然后更新第3000条注释,这将在mongoengine中起到一些作用(标记更改的字段等)。
然后保存文档。
在我的回答中,我已将更新指令发送到mongodb,而不是将带有N条注释的整个文档提取到Python中,这将节省内存(RAM)和时间。
mongoengine / MongoDB支持索引支持更新,例如
set__comments__1000__comment="blabla"
为了使用变量给出位置,我使用了python字典和kwargs技巧。