mongodb - 无法获取allowDiskUse :True to work with pymongo

标签 mongodb aggregation-framework pymongo

我在使用 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/

相关文章:

java - 关闭 MongoDB Java 连接

python - MongoDB:股票价格数据的聚合

mongodb - 如何按数组的第一个元素分组?

python - 如何使用 Python 为 Mongo 创建全局唯一的 GUID/UUID 系统?

python - 在 mongodb 中存储/使用文档管理系统的标签

regex - 如何使用 bson 在 GoLang 中为正则表达式编写 mongodb 查询?

MongoDb 管道聚合排序子子文件

mysql - 轨道 3 : Measure database performance (MongoDB and MySQL)

node.js - 需要为每个用户获取一份文档nodejs和mongodb

java - 返回唯一的mongo文档