mongodb聚合内存不足解决方案
原因:mongodb每一个文档默认只有16M。聚合的结果是一个BSON文档,当超过16M大小时,就会报内存不够错误。
exceeded memory limit for $group.but didn't allow external sort.
可以采用打开使用磁盘来解决大小问题。例如
db.flowlog.aggregate([{$group:{_id:"$_id"}}], {allowDiskUse: true})
java代码片段
AggregationOptions options = new AggregationOptions.Builder().allowDiskUse(true).build();Aggregation agg = Aggregation.newAggregation().withOptions(options);
但是如果结果集超过了16M,那么依然会报错误。
采用一个下面的聚合方法
Aggregation agg = Aggregation.newAggregation(Aggregation.group(field1, field2, field3).sum(field4).as("sampleField1").sum(field5).as("sampleField2"),Aggregation.project(field4, field5),new AggregationOperation() { @Overridepublic DBObject toDBObject(AggregationOperationContext context) {return new BasicDBObject("$out", "test");}}).withOptions(options);
mongo.aggregate(agg, sourceCollection, Test.class);
红色部分是重点,构造这个agg可以将得到的结果导入插入到out中,并且不会有16M的限制问题。
如果要在聚合的时候增加一个常量,可采用以下形式
Aggregation agg = Aggregation.newAggregation(Aggregation.group(, OnofflineUserHistoryField.MAC, StalogField.UTC_CODE).sum(OnofflineUserHistoryField.WIFI_UP_DOWN).as(OnofflineUserHistoryField.WIFI_UP_DOWN).sum(OnofflineUserHistoryField.ACTIVE_TIME).as(OnofflineUserHistoryField.ACTIVE_TIME),Aggregation.project("mac","buildingId","utcCode",OnofflineUserHistoryField.ACTIVE_TIME, OnofflineUserHistoryField.WIFI_UP_DOWN).and(new AggregationExpression() {@Overridepublic DBObject toDbObject(AggregationOperationContext context) {return new BasicDBObject("$cond", new Object[]{new BasicDBObject("$eq", new Object[]{ "$tenantId", 0}),20161114,20161114});}}).as("day").andExclude("_id"), 或者
and(new AggregationExpression() {
@Override
public DBObject toDbObject(AggregationOperationContext context) {
return new BasicDBObject("$add", new Object[] { 20141114 });
}
}).as("day").andExclude("_id"),
new AggregationOperation() { @Overridepublic DBObject toDBObject(AggregationOperationContext context) {return new BasicDBObject("$out", "dayStaInfoTmp");}}).withOptions(options);红色和棕色部分为聚合中增加常量的两种方法。目前没有找到更方便的聚合添加常量的方法。
转载于:https://www.cnblogs.com/guochunyi/p/6030663.html
mongodb聚合内存不足解决方案相关推荐
- MongoDB 聚合操作
MongoDB 聚合操作 在MongoDB中,有两种方式计算聚合:Pipeline 和 MapReduce.Pipeline查询速度快于MapReduce,但是MapReduce的强大之处在于能够在多 ...
- mongodb 聚合框架_如何使用MongoDB的聚合框架处理高级数据处理
mongodb 聚合框架 MongoDB has come a long way. Even though there are many NoSQL databases out there, Mong ...
- MongoDB聚合(二)
2019独角兽企业重金招聘Python工程师标准>>> MongoDB聚合(二)2.3 $group $group操作可以将文档根据给定字段的不同值进行分组. 如果选定了需要分组的字 ...
- MongoDB 聚合管道(Aggregation Pipeline)
管道概念 POSIX多线程的使用方式中, 有一种很重要的方式-----流水线(亦称为"管道")方式,"数据元素"流串行地被一组线程按顺序执行.它的使用架构可参考 ...
- golang mongodb 聚合(Aggregate) github.com/qiniu/qmgo框架
项目场景: 最近使用golang 来访问mongodb 出了点问题 github.com/qiniu/qmgo对于数据聚合踩了坑 官方的demo给的太少没有多分支的场景 问题描述: 网上对于golan ...
- MongoDB聚合(一)
2019独角兽企业重金招聘Python工程师标准>>> MongoDB聚合(一) 聚合框架 mapreduce 命令:count,distinct,group1. 聚合框架 使用聚合 ...
- MongoDB聚合查询 Pipeline 和 MapReduce
MongoDB聚合查询 MongoDB聚合查询 什么是聚合查询 Pipeline聚合管道方法 聚合流程 详细流程 聚合语法 常用聚合管道 $count $group $match $unwind $p ...
- vue2打包时内存溢出解决方案
vue2打包时内存溢出解决方案 参考文章: (1)vue2打包时内存溢出解决方案 (2)https://www.cnblogs.com/ZT0219/p/7872258.html 备忘一下.
- docker启动elasticsearch失败--jvm内存不足解决方案
docker启动elasticsearch失败--jvm内存不足解决方案 参考文章: (1)docker启动elasticsearch失败--jvm内存不足解决方案 (2)https://www.cn ...
- mongodb 对内存的占用监控 ——mongostat,linux系统可用的内存是free + buffers + cached...
刚开始使用mongodb的时候,不太注意mongodb的内存使用,但通过查资料发现mongodb对内存的占用是巨大的,在本地测试服务器中,8G的内存居然被占用了45%.汗呀. 本文就来剖析一下mon ...
最新文章
- sublime Text3快捷键使用大全
- bootstrap ui
- 【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | 查找 DexFile 对应的C代码 | dalvik_system_DexFile.cpp 分析 )
- jquery实现截取pc图片_jquery实现图片裁剪思路及实现
- 【论文解读】NN如何在表格数据中战胜GBDT类模型!
- 关于静态成员变量的谈论
- 【待完善】【表达学习】稀疏表达SRC方法研究
- 完美解决html中select的option不能隐藏的问题。
- 基于Modelica的起落架摆震建模
- 乐吾乐 Topology 全新优化1.0已经内测啦
- 搭建无iDP证书的Xcode环境
- conda安装requirement.txt指定的依赖包
- 前端常用PS技巧总结之更换图片背景图片
- Windows系统封装步骤
- 全国计算机二级ms备考,全国计算机二级MS office经验分享
- SDU程序设计思维Week5-作业 B-TT's Magic Cat
- redis中存集合_如何在Redis中管理集合
- UG三轴产品编程3D图档-刀路图档550例
- Python,江湖救急
- BigGAN代码解读(gpt3.5的帮助)——谱正则化部分