使用 MongoEngine for Django,如何按列表的大小过滤 QuerySet 并大于某个值?
Using MongoEngine for Django, how do I filter the QuerySet by the size of a list and greater than a value?
我正在使用 Django 1.6.8 和 MongoEngine 0.8.2。
我有 2 个 类、ServiceDocument 和 OptionDocument。 ServiceDocument 保留 OptionDocuments 的列表。有数百万个ServiceDocuments(250万+)。
我想 select 每个具有两个以上 OptionDocument 的 ServiceDocument。
我"want"这个可以工作,但结果是0:
ServiceDocument.objects.filter(options__size__gt=2).count()
这就是我的工作:
>>> ServiceDocument.objects.filter(options__size=1).count()
6582
>>> ServiceDocument.objects.filter(options__size=2).count()
2734321
>>> ServiceDocument.objects.filter(options__size=3).count()
25165
>>> ServiceDocument.objects.all().count()
2769768
最后,如果我有更少的 ServiceDocuments and/or 我可以让迭代器工作,我可以自己循环遍历它们,但是几秒钟后内存填满后我会遇到段错误(我猜任何.all() 上的操作将尝试将它们全部收集到内存中)。
对于迭代器,我尝试了以下但没有成功:
iter(ServiceDocument.objects.all())
嗯,我认为您需要为此找到解决方法,因为 mongoengine 不支持您的查询。您可以做的是添加另一个字段 'options_length' 并在其中存储选项字段的长度。然后你可以使用'__gt > 2'进行查询。额外的成本是您需要覆盖模型保存功能以在每次保存时更新长度。您还需要为此更新现有记录。
你也可以阅读这个
question
我正在使用 Django 1.6.8 和 MongoEngine 0.8.2。
我有 2 个 类、ServiceDocument 和 OptionDocument。 ServiceDocument 保留 OptionDocuments 的列表。有数百万个ServiceDocuments(250万+)。
我想 select 每个具有两个以上 OptionDocument 的 ServiceDocument。
我"want"这个可以工作,但结果是0:
ServiceDocument.objects.filter(options__size__gt=2).count()
这就是我的工作:
>>> ServiceDocument.objects.filter(options__size=1).count()
6582
>>> ServiceDocument.objects.filter(options__size=2).count()
2734321
>>> ServiceDocument.objects.filter(options__size=3).count()
25165
>>> ServiceDocument.objects.all().count()
2769768
最后,如果我有更少的 ServiceDocuments and/or 我可以让迭代器工作,我可以自己循环遍历它们,但是几秒钟后内存填满后我会遇到段错误(我猜任何.all() 上的操作将尝试将它们全部收集到内存中)。
对于迭代器,我尝试了以下但没有成功:
iter(ServiceDocument.objects.all())
嗯,我认为您需要为此找到解决方法,因为 mongoengine 不支持您的查询。您可以做的是添加另一个字段 'options_length' 并在其中存储选项字段的长度。然后你可以使用'__gt > 2'进行查询。额外的成本是您需要覆盖模型保存功能以在每次保存时更新长度。您还需要为此更新现有记录。
你也可以阅读这个 question