Mongoengine:如何将新文档附加到嵌入式ListField文档?

问题描述:

我想添加一个新的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) 

评论?建议?

你想$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