2013-02-07 219 views
8

我想添加一個新的ListField EmbeddedDocument到現有的ListField EmbeddedDocument文檔。換句話說,將新文檔附加到屬於列表中文檔的列表。Mongoengine:如何將新文檔附加到嵌入式ListField文檔?

我的模型:一個帖子可以包含多個註釋,每個註釋可以有幾個喜歡:

class Post(Document): 
    txt = StringField() 
    comments = ListField(EmbeddedDocumentField(Comment)) 

class Comment(EmbeddedDocument): 
    comment = StringField() 
    comment_id = ObjectIdField() 
    likes = ListField(EmbeddedDocumentField(Like)) 

class Like(EmbeddedDocument): 
    user = ReferenceField(User) 
    date = DateTimeField(default=datetime.utcnow,required=True) 

我的代碼:(它不工作「追加」命令這麼想的存在,只有在「設置」存在)

def appendNewLike(): 
    user = {..} 
    target = ObjectId(commentId) 
    newLike = Like(user=user) 
    Product.objects(comments__comment_id=target).update(append_comments__S__likes=newLike) 

理想的解決辦法是這樣的:

def appendNewLike(): 
    user = {..} 
    target = ObjectId(commentId) 
    newLike = Like(user=user) 
    Product.objects(comments__comment_id=target).comments.likes.append(newLike) 

評論?建議?

回答

4

你想$push一個新的項目列表例如:

Product.objects(comments__comment_id=target).update(
       push__comments__S__likes=newLike) 

不過,也有更大的問題在這裏。該模式並不理想 - 隨着文檔的增長,不斷增長的數組可能會導致問題,如果不斷增長,則會影響性能,因此它必須在磁盤上移動到新的範圍(以便它可以適用)。

查看data modeling docs瞭解更多信息。

+0

謝謝推$作品! – rat

+1

你好,在我用類實例調用reload()之前,push不起作用。產品(Product.objects(comments__comment_id = target).update( push__comments__S__likes = newLike)product.reload() – Shashank