MongoDB 聚合结果大小限制
The aggregate command can return either a cursor or store the results in a collection. When returning a cursor or storing the results in a collection, each document in the result set is subject to the BSON Document Size limit, currently 16 megabytes; if any single document that exceeds the BSON Document Size limit, the command will produce an error. The limit only applies to the returned documents; during the pipeline processing, the documents may exceed this size. The db.collection.aggregate() method returns a cursor by default.
each document in the result set is subject to the BSON Document Size limit, currently 16 megabytes
我想知道这个 result set 是否就是 aggregate 返回的 result。如果是,那么 result set 中的单个元素的大小不能超过 16MB,否则整个 result set 的大小总和不能超过 16MB。
结论是 result 中的单个文件不能超过限制。
使用两个 10 MB 的文件进行模拟:
from pymongo import MongoClient
from unittest import TestCase
class TestAggregateSizeLimit(TestCase):
def setUp(self):
self.client = MongoClient()
self.coll = self.client['test-database']['test-collection']
with open('10mb.txt', 'r') as f:
content = f.read()
self.coll.insert_one({
'filename': 1,
'content': content
})
self.coll.insert_one({
'filename': 2,
'content': content
})
def tearDown(self):
self.client.drop_database('test-database')
def test_two_aggregate_result(self):
result = list(self.coll.aggregate(
[
{'$sort': {'_id': 1}},
{'$group': {'_id': '$filename', 'content': {'$first': '$content'}}}
]
))
if result:
print('多个文件总和超过 16 MB,但是单个文件没有超过 16MB,没有问题')
else:
print('多个文件总和超过 16 MB,但是单个文件没有超过 16MB,有问题')
def test_one_aggregate_result(self):
try:
list(self.coll.aggregate(
[
{'$group': {'_id': None, 'content': {'$push': '$content'}}}
]
))
except Exception as e:
# pymongo==2.8 报错 “$cmd failed: aggregation result exceeds maximum document size (16MB)”
# pymongo==3.7.0 报错 “BSONObj size: 20971635 (0x1400073) is invalid. Size must be between 0 and 16793600(16MB) ”
print(e)
print('结果中的单个文件超过 16MB,有问题')
else:
print('结果中的单个文件超过 16MB,没有问题')
完整代码见 https://github.com/Jay54520/playground/tree/master/mongodb_size_limit
另外,在搜索过程中发现有人说 allowDiskUse 可以解除这个限制,这个是错误的。allowDiskUse 用于避免 pipeline 的 stage 的内存使用超过 100 MB 而报错,而上面的限制是针对单个文件而言。
Pipeline stages have a limit of 100 megabytes of RAM. If a stage exceeds this limit, MongoDB will produce an error. To allow for the handling of large datasets, use the allowDiskUse option to enable aggregation pipeline stages to write data to temporary files.[2]
参考
- https://docs.mongodb.com/manual/core/aggregation-pipeline-limits/#result-size-restrictions
- https://docs.mongodb.com/manual/core/aggregation-pipeline-limits/#memory-restrictions
MongoDB 聚合结果大小限制的更多相关文章
- MongoDB 聚合管道(Aggregation Pipeline)
管道概念 POSIX多线程的使用方式中, 有一种很重要的方式-----流水线(亦称为"管道")方式,"数据元素"流串行地被一组线程按顺序执行.它的使用架构可参考 ...
- Mongodb学习笔记四(Mongodb聚合函数)
第四章 Mongodb聚合函数 插入 测试数据 ;j<;j++){ for(var i=1;i<3;i++){ var person={ Name:"jack"+i, ...
- mongodb MongoDB 聚合 group
MongoDB 聚合 MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). 基本语法为:db.col ...
- MongoDB 聚合
聚合操作过程中的数据记录和计算结果返回.聚合操作分组值从多个文档,并可以执行各种操作,分组数据返回单个结果.在SQL COUNT(*)和group by 相当于MongoDB的聚集. aggregat ...
- MongoDB聚合
--------------------MongoDB聚合-------------------- 1.aggregate(): 1.概念: 1.简介 ...
- MongoDB 聚合分组取第一条记录的案例及实现
关键字:MongoDB: aggregate:forEach 今天开发同学向我们提了一个紧急的需求,从集合mt_resources_access_log中,根据字段refererDomain分组,取分 ...
- mongodb MongoDB 聚合 group(转)
MongoDB 聚合 MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). 基本语法为:db.col ...
- mongodb聚合 group
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). 基本语法为:db.collection.agg ...
- MongoDB 聚合(管道与表达式)
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). aggregate() 方法 MongoDB中 ...
随机推荐
- SAP ECC6安装系列四:安装过程详解
原作者博客 http://www.cnblogs.com/Michael_z/ ======================================== 续接上篇,我们终于按下了 “Next” ...
- Oracle 11g安装图文攻略
一.Oracle 下载 注意Oracle分成两个文件,下载完后,将两个文件解压到同一目录下即可. 路径名称中,最好不要出现中文,也不要出现空格等不规则字符. 官方下地址: http://www.ora ...
- Jquery 事件执行两次
js(jquery)的on绑定点击事件执行两次的解决办法—不是事件绑定而是事件冒泡 阻止冒泡的方法并不止 return false 这一种,还有event.stopPropagation(),这两种方 ...
- ibatis时间比较大小
<![CDATA[ A.RFID_Time >= #StartTime# ]]>时间搜索功能 A.RFID_Time <![CDATA[ ...
- 关于love2d教程的更新
实在抱歉,每周工作六天,一天13小时以上,周日想休息一下,love2d的估计一个月一篇都很难做到了. 三个月后公司的项目应该做完了,那时应该有时间了. love2d估计快发布0.9了,改动应该不是很大 ...
- ES6学习笔记(1,let和const)
在介绍let和const之前我们先复习一下相关的知识点. 关于函数作用域 开发过程中,在ES6(ECMA2015)标准推出之前,声明变量的方式一直都是var,而变量的作用域一般也只在函数内部,即函数作 ...
- Easyui Datagrid相同连续列合并扩展(三)
function MergeCells(seletor, rows, fields) { if(rows == null || rows.length == 0 || fields == null | ...
- 举例说明:Hadoop vs. NoSql vs. Sql vs. NewSql
转自:http://blog.jobbole.com/86269/ 尽管层次数据库如今在大型机上依然被广泛使用,但关系数据库(RDBMS)(SQL)已经占领了数据库市场,并且表现的相当优异.我们存 ...
- MVC已经是现代Web开发中的一个很重要的部分,下面介绍一下Spring MVC的一些使用心得。
MVC已经是现代Web开发中的一个很重要的部分,下面介绍一下Spring MVC的一些使用心得. 之前的项目比较简单,多是用JSP .Servlet + JDBC 直接搞定,在项目中尝试用 Strut ...
- Servlet采用多线程来处理多个请求同时访问
Servlet采用多线程来处理多个请求同时访问,Servlet容器维护了一个线程池来服务请求.