mongoengine查询嵌入文档列表

时间:2014-02-20 09:51:47

标签: mongodb mongoengine

我遇到了经典的陷阱,但找不到我应该做的mongoengine的好例子。

使用标准博客示例我有类似的内容:

class Comment(EmbeddedDocument):
    author = StringField()
    approved = BooleanField(default=False)

class Post(Document):
    id = StringField(required=True, unique=True)
    comments = ListField(EmbeddedDocumentField(Comment))

对于给定的博客帖子(标识为some_id),我只想加载已批准的评论列表。如果帖子的任何评论被批准,我会不小心加载所有评论,因为我匹配列表中的元素。

2 个答案:

答案 0 :(得分:9)

在你的模特中试试这个:

class Comment(EmbeddedDocument):
    author = StringField()
    approved = BooleanField(default=False)

class Post(Document):
    id = StringField(required=True, unique=True)
    comments = EmbeddedDocumentListField(Comment)

注意:EmbeddedDocumentListField而不是ListField

然后以这种方式查询

comments_approved =  Post.objects.get(pk=post_id).comments.filter(approve=True)

我希望能帮到你!

答案 1 :(得分:5)

由于评论包含在文档中,因此评论将始终包含所有评论。

向Post过滤器添加一个属性,仅返回已批准的评论列表,例如:

@property
def approved_comments(self):
    return [comment for comment in self.comments if comment.approved]