Почему это так медленно, когда обновление ListField в mongoengine? - PullRequest
0 голосов
/ 06 мая 2019

Это слишком медленно, когда я обновляю ListField с помощью mongoengine. Вот пример

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 Ответ

1 голос
/ 06 мая 2019
Post.objects(id=str(_id)).update(**{"comments__{}__comment".format(position): update_comment_str})

В вашем коде.

  1. Вы загрузили весь документ в экземпляр Python, который будет находиться в оперативной памяти.

  2. Затемобновить 3000-е комментарии, которые сделают магию в mongoengine (пометка измененных полей и т. д.).

  3. Затем сохранит документ.

В моемответ, я отправил инструкцию по обновлению на mongodb вместо загрузки целых документов с N комментариями в Python, что сэкономит память (RAM) и время.

mongoengine / MongoDB поддерживает обновление поддержки индекса, например

set__comments__1000__comment="blabla"

Чтобы определить положение с помощью переменной, я использовал словарь python и трюк kwargs.

...