中国建设教育协会网站证书,祝明电子商务网站建设实验报告,长春seo排名公司,广安公司网站建设MongoDB聚合管道功能非常丰富且强大#xff0c;能够实现各种复杂的聚合查询和数据处理#xff0c;我们在利用强大功能的同时#xff0c;也需要了解其限制和约束#xff0c;这样才能在系统设计时做到用其长避其短。聚合管道的限制主要有几个方面#xff0c;分别是结果结果、…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内存的限制因为它在一个单独的进程中运行。
当allowDiskUse为true时下面的这些聚合阶段可以把运行时的临时文件写入到磁盘上$bucket、$bucketAuto、$group、$setWindowFields、$sort当索引不支持排序操作时、$sortByCount。
注意
聚合管道的每个阶段处理的过程都有三个步骤接收文档、处理文档、输出生成文档。有些管道阶段只有在处理完所有输入文档后才能输出文档因此需要把数据存储在内存中当数据较多时就可能会超过100M的限制。要避免这个问题需要一方面对业务数据有一个大致的估算另一方面可以根据情况使用allowDiskUseByDefault和allowDiskUse来启用磁盘缓存。比如$sort操作时如果超过了内存限制也可以加个$limit阶段.