无法获得allowDiskUse:True可以与pymongo一起使用

时间:2014-12-03 13:15:23

标签: mongodb aggregation-framework pymongo

我使用pymongo在mongodb聚合中遇到aggregation result exceeds maximum document size (16MB)错误。

我首先使用limit()选项克服了它。但是,在某些时候我得到了

Exceeded memory limit for $group, but didn't allow external sort. Pass allowDiskUse:true to opt in." error.

好的,我将使用{'allowDiskUse':True}选项。当我在命令行上使用它时,此选项有效,但当我尝试在我的python代码中使用时

result = work1.aggregate(pipe, 'allowDiskUse:true')

我收到TypeError: aggregate() takes exactly 2 arguments (3 given)错误。 (尽管在http://api.mongodb.org/python/current/api/pymongo/collection.html#pymongo.collection.Collection.aggregate给出了定义:聚合(管道,** kwargs))。

我尝试使用runCommand,或者更确切地说是它的pymongo等价物:

db.command('aggregate','work1',pipe, {'allowDiskUse':True})

但现在我回到了“聚合结果超过最大文档大小(16MB)”的问题。错误

如果您需要知道

pipe = [{'$project': {'_id': 0, 'summary.trigrams': 1}}, {'$unwind': '$summary'}, {'$unwind': '$summary.trigrams'}, {'$group': {'count': {'$sum': 1}, '_id': '$summary.trigrams'}}, {'$sort': {'count': -1}}, {'$limit': 10000}]

谢谢

1 个答案:

答案 0 :(得分:34)

所以,按顺序:

  • aggregate是一种方法。它需要2个位置参数(self,隐式传递,pipeline)和任意数量的关键字参数(必须作为foo=bar传递 - 如果没有=符号,那么它不是关键字参数。这意味着您需要致电result = work1.aggregate(pipe, allowDiskUse=True)

  • 有关最大文档大小的错误是Mongo固有的。 Mongo永远不会返回大于16兆字节的文档(或其数组)。我不能告诉你为什么,因为你既没有给你我们的数据也没有给你我们的代码,但这可能意味着你作为最终结果建立的文件太大了。尝试减少$limit参数,也许?首先将其设置为1,运行测试,然后增加测试,并查看结果有多大。