使用 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