Python mongoengine-查询如何按列表字段大小进行筛选

Python mongoengine-查询如何按列表字段大小进行筛选,python,mongodb,mongoengine,mongodb-query,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, req

我有以下型号:

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个喜欢的帖子(列表字段大小大于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个likes),它会起作用:

posts = Post.objects.filter(likes__size=20) 

注释?

不能将$size用于一系列值

从mongo的网站:

$size不接受值的范围。根据不同字段选择文档的步骤 元素数,创建一个计数器字段,在向字段添加元素时递增该字段

这是导致答案的相关问题的链接:

这是上一个链接链接的mongo页面,上面的块中提供了文档:


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

远不是完美的解决方案,但您可以使用原始mongo查询和运算符,例如:

posts = Post.objects.filter(__raw__={'$where': 'this.likes.length > 20'})
另一个选择应该更快,但我认为不太清楚,就是检查第21个元素是否存在:

posts = Post.objects.filter(likes__21__exists=True)
第二个选项仅在使用MongoDB 2.2时有效+


来源:摘自这些,并应用于MongoEngine。

谢谢。您知道是否有任何计划来实现此功能吗?即将发布的发行说明中没有任何内容表明这一点会发生变化,但我对2.2.4版本之外的开发没有任何了解。我想原因可能与$size是如何在引擎盖下实现的有关,而事实上他们并没有这么做,但我从来没有看过,所以我不知道确切的原因。这是一个很好的技巧。Tks。我很好奇在服务器端使用“长度”是否会很贵。是的,有点贵。您基本上是在为每个文档评估函数(在本例中为
length>20
)。
exists
版本应该更高效…来自mongo文档: