У меня есть следующие модели:mongoengine - запрос, как фильтровать по размеру ListField
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)
Комментарии?
Это хороший хак. Tks. Мне любопытно, если использование «длины» не будет дорогостоящим на сервере. – rat
Да, это немного дорого. Вы в основном оцениваете функцию (в данном случае 'длина> 20') для каждого документа. Версия 'exist' должна быть намного более эффективной ... – yprez
Из документов mongo: http://docs.mongodb.org/manual/reference/operator/query/where/ – yprez