Mongoengine:如何将新文档附加到Embedded ListField文档?

时间:2013-02-07 02:25:01

标签: mongodb append mongoengine listfield

我想将一个新的ListField EmbeddedDocument附加到现有的ListField EmbeddedDocument文档中。换句话说,将新文档附加到属于列表中文档的列表中。

我的模型:帖子可以包含多个评论,每个评论可以有几个赞:

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)

我的代码:(它没有工作'append'命令不存在,只有'set'存在)

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)

评论?建议?

1 个答案:

答案 0 :(得分:4)

您希望$push列表中的新项目,例如:

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

然而,这里有更大的问题。架构并不理想 - 随着文档的增长,不断增长的阵列可能会导致问题,它必须在磁盘上移动到新的程度(因此它可以适应),如果它不断增长则会影响性能。

有关详细信息,请参阅data modeling docs

相关问题