2014-02-20 96 views
3

我遇到了一個典型的陷阱,但找不到mongoengine應該做的一個很好的例子。mongoengine查詢嵌入式文檔的列表

使用標準的博客的例子,我有類似:

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

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

對於給定的博客文章(id爲some_id)我只是想加載的批准意見的名單。如果任何帖子的評論都獲得批准,我會不小心加載所有評論,因爲我與列表中的某個元素相匹配。

回答

5

由於評論包含在文檔中,評論將始終包含所有評論。

添加一個屬性來發布該濾波器,僅返回批准的評論如列表:

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

那麼,這將解釋爲什麼我不知道如何去做... – TristanMatthews

7

在你的模型試試這個:

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) 

我希望能幫到你!

+0

真棒,這應該被選爲答案) –