2016-12-09 55 views
1

假設我們有以下幾點。如何使用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.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>)

回答

1

嘗試:

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不會加兩次。

+0

非常感謝。有效! 。我認爲我們現在應該使用** update **而不是** update_one **方法,因爲我們正在更新對象列表。我們不會爲你的方式做* * for循環 –

+0

使用update_one sinc你更新1篇文章。 – sergiuz

相關問題