我在使用 pymongo 进行 mongodb 聚合时遇到 聚合结果超出最大文档大小 (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() 恰好需要 2 个参数(3 个给定)
错误。 (尽管 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}]
谢谢
最佳答案
所以,按顺序:
aggregate
是一种方法。它需要 2 个位置参数(self
,隐式传递,以及pipeline
)和任意数量的 keyword 参数(必须作为foo=bar
-- 如果没有=
符号,则它不是关键字参数)。这意味着您需要调用result = work1.aggregate(pipe, allowDiskUse=True)
。您关于最大文档大小的错误是 Mongo 固有的。 Mongo 永远不能返回大于 16 兆字节的文档(或其数组)。我不能告诉你为什么,因为你既没有给我们你的数据也没有给我们你的代码,但这可能意味着你最终构建的文档太大了。尝试减少
$limit
参数,也许?首先将其设置为 1,运行测试,然后增加它并查看执行此操作时结果有多大。
关于mongodb - 无法获取allowDiskUse :True to work with pymongo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27272699/