关于python:另一个-查询如何按ListField大小进行过滤

mongoengine - query how to filter by ListField size

我有以下模型:

1
2
3
4
5
6
7
8
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)的帖子。 我试图查询使用:

1
2
3
4
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喜欢),则它可以工作:

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

注释?


远非完美的解决方案,但您可以使用原始的mongo查询和$ where运算符进行操作,例如:

1
posts = Post.objects.filter(__raw__={'$where': 'this.likes.length > 20'})

另一个选项应该运行得更快,但我认为尚不清楚,它是检查第21个元素是否存在:

1
posts = Post.objects.filter(likes__21__exists=True)

第二个选项仅在使用MongoDB 2.2+时有效

资料来源:摘自这些答案,并应用于MongoEngine。


您不能将$ size用作一系列值。

在mongo网站上:

$size does not accept ranges of values. To select documents based on fields with different
numbers of elements, create a counter field that you increment when you add elements to a field.

这是导致相关问题的相关问题的链接:在mongoDB中删除数组字段大小小于3的文档

这是上一个链接所链接到的mongo页面,在上面的方框中提供了文档:
http://docs.mongodb.org/manual/reference/operator/size/#_S_size

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