我正在使用Django 1.6.8和MongoEngine 0.8.2。

我有2类,ServiceDocument和OptionDocument。 ServiceDocument保留OptionDocuments列表。有数百万个ServiceDocument(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

关于python - 使用适用于Django的MongoEngine,如何通过列表的大小和大于值的值过滤QuerySet?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31049324/

10-09 05:31