关于mongodb:无法获得allowDiskUse:可以与pymongo一起使用

Can't get allowDiskUse:True to work with pymongo

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

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

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

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

1
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:Aggregate(pipeline,** kwargs)给出了定义)。

我试图使用runCommand,或者它等效于pymongo:

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

但现在我回到"聚合结果超出最大文档大小(16MB)"错误

如果您需要知道

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

谢谢


因此,为了:

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

  • 关于最大文档大小的错误是Mongo固有的。 Mongo绝不能返回大于16 MB的文档(或其数组)。 我无法告诉您原因,因为您既没有给我们数据也没有给我们代码,但这可能意味着最终要构建的文档太大。 尝试减小$limit参数,也许吗? 首先将其设置为1,运行一个测试,然后增加它并查看当您这样做时结果有多大。