MongoDB聚合管道的限制

MongoDB聚合管道功能非常丰富且强大,能够实现各种复杂的聚合查询和数据处理,我们在利用强大功能的同时,也需要了解其限制和约束,这样才能在系统设计时做到用其长避其短。聚合管道的限制主要有几个方面,分别是结果结果、阶段数量、内存等三个方面的限制。

返回结果大小的限制

聚合管道命令可以返回游标也可以返回集合,但是结果集中单个文档大小不能超过BSON文档16M的限制(单个BSON文档大小<=16M),如果超过BSON文档大小的限制聚合会产生错误。这个限制只针对返回结果,对于聚合的处理过程则没有影响。缺省情况下db.collection.aggregate()返回游标。

聚合阶段数量的限制

从MongoDB 5.0开始,单个管道中允许的最多聚合管道级数1000。通常手写的管道不会这么长了,一些程序自动生成的管道应该稍注意下这一问题,不要突破这一限制,不够的时候可以把结果暂存,对管道阶段进行适当的拆分。

内存的限制

在默认情况下,MongoDB为每个操作分配了100兆字节(MB)的内存。当聚合结果数据量太大时,有些操作如:排序就可能会占用更多的内存,导致超出限制。从MongoDB 6.0开始,allowDiskUseByDefault参数可控制当内存超出限制时是否默认写入磁盘。

  • 当allowDiskUseByDefault为true时,如果执行管道需要的内存超过100M,默认会把临时文件写入磁盘,使用 { allowDiskUse: false } 选项可以禁止将特定查找或聚合命令的临时文件写入磁盘。

  • 当allowDiskUseByDefault为false时,超过 100 MB 内存才能执行的管道阶段默认会出错。此时也可以使用{ allowDiskUse: true }选项为特定的查找或聚合启用向磁盘写入临时文件的功能。

不过$search阶段没有100M内存的限制,因为它在一个单独的进程中运行。

allowDiskUsetrue时,下面的这些聚合阶段可以把运行时的临时文件写入到磁盘上:$bucket$bucketAuto$group$setWindowFields$sort(当索引不支持排序操作时)、$sortByCount

注意:

聚合管道的每个阶段处理的过程都有三个步骤:接收文档、处理文档、输出生成文档。有些管道阶段只有在处理完所有输入文档后才能输出文档,因此需要把数据存储在内存中,当数据较多时,就可能会超过100M的限制。要避免这个问题需要一方面对业务数据有一个大致的估算,另一方面可以根据情况使用allowDiskUseByDefaultallowDiskUse来启用磁盘缓存。比如$sort操作时,如果超过了内存限制,也可以加个$limit阶段.

相关推荐

  1. MongoDB聚合管道限制

    2023-12-23 23:30:02       44 阅读
  2. MongoDB聚合管道:$match

    2023-12-23 23:30:02       34 阅读
  3. MongoDB聚合:$out

    2023-12-23 23:30:02       40 阅读
  4. MongoDB聚合:$replaceRoot

    2023-12-23 23:30:02       37 阅读
  5. MongoDB聚合:$addField

    2023-12-23 23:30:02       37 阅读
  6. MongoDB聚合:$facet

    2023-12-23 23:30:02       37 阅读
  7. MongoDB聚合:$bucket

    2023-12-23 23:30:02       34 阅读
  8. MongoDB聚合:$bucketAuto

    2023-12-23 23:30:02       36 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-23 23:30:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-23 23:30:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-23 23:30:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-23 23:30:02       20 阅读

热门阅读

  1. 每日一题(LeetCode)----栈和队列--逆波兰表达式求值

    2023-12-23 23:30:02       45 阅读
  2. lc1:两数之和

    2023-12-23 23:30:02       37 阅读
  3. 漫谈计算机安全

    2023-12-23 23:30:02       37 阅读
  4. Oracle 11g体系结构整理-明日科技编著

    2023-12-23 23:30:02       35 阅读
  5. ffmpeg 打印视频帧的数量

    2023-12-23 23:30:02       44 阅读
  6. ElasticSearch DSL Bool查询

    2023-12-23 23:30:02       43 阅读
  7. MyBatis的延迟加载(懒加载)

    2023-12-23 23:30:02       44 阅读
  8. SpringBoot整合Mybatis遇到的常见问题及解决方案

    2023-12-23 23:30:02       44 阅读
  9. 点云分割--基于PatchWork++的地面点云分割

    2023-12-23 23:30:02       46 阅读