如何使用 Mongoclient 更新单个文档的嵌入式文档列表字段?
How to update an Embedded Document List Field for single document with 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()
所以,我们已经保存了一个Post,没有任何评论。每个 post 都是 唯一的 。
然后,我有一个 Comments 对象列表。我想做一个 for 循环,以便一个一个地保存它们,或者创建一个评论对象列表并更新一次。
此外,我想检查 Post.comment 列表字段中是否有一些 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
不会添加两次。
假设我们有以下内容。
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()
所以,我们已经保存了一个Post,没有任何评论。每个 post 都是 唯一的 。
然后,我有一个 Comments 对象列表。我想做一个 for 循环,以便一个一个地保存它们,或者创建一个评论对象列表并更新一次。
此外,我想检查 Post.comment 列表字段中是否有一些 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
不会添加两次。