mongoengine - 查询如何按ListField大小过滤

时间:2013-02-21 22:26:45

标签: python mongodb mongoengine mongodb-query

我有以下型号:

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) 

评论

2 个答案:

答案 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

尝试按文本块中的建议添加计数器字段。