Как обновить поле списка встроенных документов для одного документа с Mongoclient?

Допустим, у нас есть следующее.

class Post(Document):
    uid = StringField(required=True, unique=True)
    text = StringField(required=True
    comments = EmbeddedDocumentListField(Comment)

class Comment(EmbeddedDocument):
    comment_id = StringField(required=True)
    comment = StringField(required=True)
    datetime = DatetimeField()

Итак, мы уже сохранили сообщение без комментариев. Каждый пост уникален.

Затем у меня есть список объектов комментариев. Я хочу сделать цикл for, чтобы сохранить их один за другим, или создать список объектов комментариев и обновить их один раз.

Кроме того, я хотел бы проверить, находятся ли некоторые из этих объектов комментариев в поле списка Post.comment.

я пытался

        for comment in comments:

            o_comment = Comment()
            o_comment.id = comment.get('id')
            o_comment.comment = comment.get('comment')
            o_comment.datetime = datetime.now()
            Post.objects(uid = 'some_id').update_one(push__comments = o_comment)

Итак, это работает, но добавляет документы без проверки. Поэтому, если я запускаю его много раз, я получаю дубликаты.

Любая идея? Еще раз спасибо.

1 ответ

Решение

Попробуйте использовать update_one(add_to_set__comments = <list_of_comments>):

comment1 = Comment(comment_id='1', comment='comment1', datetime=datetime.datetime.now())
comment2 = Comment(comment_id='2', comment='comment2', datetime=datetime.datetime.now())
comment3 = Comment(comment_id='3', comment='comment3', datetime=datetime.datetime.now())

comments1=[comment1, comment2]
comments2=[comment2, comment3]


Post.objects(uid = post.uid).update_one(add_to_set__comments = comments1)    
Post.objects(uid = post.uid).update_one(add_to_set__comments = comments2)

Эти 2 обновления, будут добавлять каждый документы от comments1 список и comments2 список в наборе, следовательно comment2 не будет добавлен дважды.

Другие вопросы по тегам