Skip to main content
 首页 » 编程设计

python之使用 MongoEngine for Django,如何按列表的大小过滤 QuerySet 并大于某个值

2025年05月04日37yxwkf

我正在使用 Django 1.6.8 和 MongoEngine 0.8.2。

我有 2 个类,ServiceDocument 和 OptionDocument。 ServiceDocument 保留 OptionDocuments 的列表。有数百万个 ServiceDocuments(超过 250 万个)。

我想选择每个具有两个以上 OptionDocument 的 ServiceDocument。

我“希望”它能工作,但结果是 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 和/或我可以让迭代器工作,我可以自己循环遍历它们,但是在几秒钟后内存填满后我会遇到段错误(我猜对 .all 的任何操作() 将尝试将它们全部收集到内存中)。

对于迭代器,我尝试了以下但没有成功:

iter(ServiceDocument.objects.all()) 

请您参考如下方法:

嗯,我认为您需要为此找到解决方法,因为 mongoengine 不支持您的查询。您可以做的是添加另一个字段,比如“options_length”,并将选项字段的长度存储在其中。然后您可以使用'__gt > 2'进行查询。额外的成本是您需要覆盖模型保存功能以在每次保存时更新长度。您还需要为此更新现有记录。

你也可以阅读这个 question