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

非常感谢.

推荐答案

因此,为了:

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

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

Mongodb相关问答推荐

如何在MongoDB中对两个数组进行分组?

MongoDB - 来自先前匹配文档的聚合匹配字段

Mongo聚合的具体格式

在 ExpirePolicy 之后从 Store 中删除元素

Mongo:投影不影响布尔值

mongodb中集合的最大大小是多少

如何使用 -number 后缀对字符串进行 MongoDB 查询排序?

Clojure 和 NoSQL 数据库

使用 Mongoid 和 Ruby 查询最近 30 天的日期范围?

在 mongoDB 中展平嵌套的 JSON struct

Mongodb 类型引用 node

如何使用 Pymongo 在 MongoDB 中 Select 单个字段?

Mongodb Atlas:管理员未授权执行命令

如何在第一个文档中恢复 MongoDB ChangeStream 而不仅仅是在我开始收听后更改

PyMongo 中的警告消息:count is deprecated

判断字段是否存在于数组的子文档中

如何在 golang 和 mongodb 中通过 id 查找

Lombok - java.lang.StackOverflowError:toString 方法上的 null

如何通过键名从 mongoDB 中检索值?

Mongoose 为所有嵌套对象添加 _id