我有以下型号:
class Like(EmbeddedDocument):
user = ReferenceField(User,dbref=False)
date = DateTimeField(default=datetime.utcnow,required=True)
meta = {'allow_inheritance': False}
class Post(Document):
name = StringField(max_length=120, required=True)
likes = ListField(EmbeddedDocumentField(Like))
我想只过滤超过20个喜欢的帖子(ListField大小超过20个)。我试图使用:
进行查询posts = Post.objects.filter(likes__size_gte=20)
posts = Post.objects.filter(likes_gte=20)
posts = Post.objects.filter(likes__gte=20)
posts = Post.objects.filter(likes__size_gte=20)
它们都不起作用。
但是,如果我使用完全匹配(ListField大小恰好是20个喜欢),它可以工作:
posts = Post.objects.filter(likes__size=20)
评论
答案 0 :(得分:12)
远非完美的解决方案,但您可以使用原始mongo查询和$where运算符,例如:
posts = Post.objects.filter(__raw__={'$where': 'this.likes.length > 20'})
另一种选择,应该更快,但在我看来不太清楚,是检查第21个元素是否存在:
posts = Post.objects.filter(likes__21__exists=True)
第二个选项仅在您使用MongoDB 2.2 +
时有效来源:取自这些answers并应用于MongoEngine。
答案 1 :(得分:4)
您不能将$ size用于一系列值。
来自mongo的网站:
$ size不接受值范围。根据具有不同字段的字段选择文档 元素数量,创建一个计数器字段,在向元素添加元素时递增。
这是导致答案的相关问题的链接:remove documents with array field's size less than 3 in mongoDB
这是上一个链接到的mongo页面,它提供了以上块中的文档: http://docs.mongodb.org/manual/reference/operator/size/#_S_size
尝试按文本块中的建议添加计数器字段。