【问题标题】:Can't get allowDiskUse:True to work with pymongo无法让 allowDiskUse:True 与 pymongo 一起使用
【发布时间】:2015-02-01 01:46:13
【问题描述】:

我在使用 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:aggregate(pipeline, **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}]

谢谢

【问题讨论】:

    标签: mongodb aggregation-framework pymongo


    【解决方案1】:

    所以,按顺序:

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

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

    【讨论】:

    • >>work1.aggregate(pipe, allowDiskUse=True)。成功了,完美,谢谢
    • @Max Noel 添加allowDiskUse=True 后,我不再看到bson 大小限制为16mb 的问题,但是,我从pymongo 方面收到了另一个大小错误:raise DocumentTooLarge("command document too large") pymongo.errors.DocumentTooLarge: command document too large 你经历过这个吗?
    猜你喜欢
    • 2014-10-31
    • 2018-01-02
    • 2016-11-14
    • 2019-05-10
    • 2017-11-20
    • 2011-05-24
    • 2019-05-17
    • 2018-06-02
    • 2019-04-30
    相关资源
    最近更新 更多