I'm running into a classic pitfall, but can't find a good example with mongoengine of what I should be doing.
Using the standard blog example I have something like:
class Comment(EmbeddedDocument):
author = StringField()
approved = BooleanField(default=False)
class Post(Document):
id = StringField(required=True, unique=True)
comments = ListField(EmbeddedDocumentField(Comment))
For a given blog post (with id some_id
) I just want to load the list of approved comments. I keep accidentally loading all comments if any of the comments for the post are approved, because I'm matching an element of the list.
As the comments are contained with the document then comments will always contain all comments.
Add a property to Post that filters and only returns a list of approved comments eg:
@property
def approved_comments(self):
return [comment for comment in self.comments if comment.approved]
Try this in your models:
class Comment(EmbeddedDocument):
author = StringField()
approved = BooleanField(default=False)
class Post(Document):
id = StringField(required=True, unique=True)
comments = EmbeddedDocumentListField(Comment)
NOTICE: EmbeddedDocumentListField instead ListField
Then your query in this way
comments_approved = Post.objects.get(pk=post_id).comments.filter(approve=True)
I Hope help you!
来源:https://stackoverflow.com/questions/21904082/mongoengine-query-a-list-of-embedded-documents