如何使用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)

所以,这有效,但它在不检查的情况下附加文档。因此,如果我多次运行它,我会收到重复项。

知道吗?再次感谢。

尝试使用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不会添加两次。

最新更新