10

我想将新的 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)

我的代码:(不存在“附加”命令不存在,仅存在“设置”)

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

1 回答 1

5

您想将$push新项目添加到列表中,例如:

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

然而,这里有更大的问题。该模式并不理想 - 随着文档的增长,不断增长的数组可能会导致问题,它必须在磁盘上移动到一个新的范围(以便它可以适应),如果它不断增长,那么这将影响性能。

有关更多信息,请参阅数据建模文档

于 2013-02-08T12:10:38.693 回答