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文档: