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
尝试按照文本块中的建议添加一个计数器字段。