为什么在mongoengine中更新ListField时这么慢?

时间:2019-05-06 13:36:03

标签: python mongodb mongoengine

当我使用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长度的增加而增加。 如何优化它?

1 个答案:

答案 0 :(得分:1)

Post.objects(id=str(_id)).update(**{"comments__{}__comment".format(position): update_comment_str})

在您的代码中。

  1. 您已将整个文档提取到将在RAM中发生的python实例中。

  2. 然后更新第3000条注释,这将在mongoengine中起到一些作用(标记更改的字段等)。

  3. 然后保存文档。

在我的回答中,我已将更新指令发送到mongodb,而不是将带有N条注释的整个文档提取到Python中,这将节省内存(RAM)和时间。

mongoengine / MongoDB支持索引支持更新,例如

set__comments__1000__comment="blabla"

为了使用变量给出位置,我使用了python字典和kwargs技巧。