mongo aggregate 用法记录
mongo 聚合查询查询还是很方便的,做下记录 依赖的jar是org.springframework.data.mongodb 1.9.6 低版本可能不支持.
数据结构 大概是 这是一份问卷,问卷有15题,统计
{
"_id": ObjectId("5a30eeef84aeea4fbcd6045c"),
"_class": "com.fjhb.elearning.model.QuestionnaireSurvey",
"questionnaireId": "321",
"questionnaireType": "2",
"completeTime": ISODate("2017-12-13T09:12:15.613+0000"),
"personMessage": {
"phone": "13003831002",
"jobType": NumberInt(2),
"identity": "农村校校长、园长",
"name": "",
"studentId": ""
},
"regionDto": {
"_id": "350102",
"parentId": "350100",
"path": "/350000/350100/350102",
"sort": NumberInt(0),
"name": "鼓楼区",
"version": "GB/T2260-2007",
"available": NumberInt(1),
"beginTime": ISODate("2018-01-02T16:00:00.000+0000"),
"endTime": ISODate("2018-01-03T16:00:00.000+0000")
},
"basicQuestionnaireSurvey": [{
"_id": "1",
"title": "1.您对本县(市、区)政府在优先发展教育,积极推动教育事业发展的总体评价是:",
"basicQuestionItems": [{
"_id": "1",
"select": true,
"score": NumberInt(100),
"content": "满意"
},
{
"_id": "2",
"select": false,
"score": NumberInt(80),
"content": "基本满意"
},
{
"_id": "3",
"select": false,
"score": NumberInt(60),
"content": "一般"
},
{
"_id": "4",
"select": false,
"score": NumberInt(40),
"content": "不太满意"
},
{
"_id": "5",
"select": false,
"score": NumberInt(20),
"content": "不满意"
}
]
},
{
"_id": "2",
"title": "2.您对本县(市、区)政府在促进教育公平、提高教育质量的总体评价是:",
"basicQuestionItems": [{
"_id": "1",
"select": true,
"score": NumberInt(100),
"content": "满意"
},
{
"_id": "2",
"select": false,
"score": NumberInt(80),
"content": "基本满意"
},
{
"_id": "3",
"select": false,
"score": NumberInt(60),
"content": "一般"
},
{
"_id": "4",
"select": false,
"score": NumberInt(40),
"content": "不太满意"
},
{
"_id": "5",
"select": false,
"score": NumberInt(20),
"content": "不满意"
}
]
},
{
"_id": "3",
"title": "3.您对本县(市、区)落实义务教育阶段就学生近入学政策是否满意?",
"basicQuestionItems": [{
"_id": "1",
"select": true,
"score": NumberInt(100),
"content": "满意"
},
{
"_id": "2",
"select": false,
"score": NumberInt(80),
"content": "基本满意"
},
{
"_id": "3",
"select": false,
"score": NumberInt(60),
"content": "一般"
},
{
"_id": "4",
"select": false,
"score": NumberInt(40),
"content": "不太满意"
},
{
"_id": "5",
"select": false,
"score": NumberInt(20),
"content": "不满意"
}
]
},
{
"_id": "4",
"title": "4.您对本县(市、区)解决义务教育阶段择校问题的评价是:",
"basicQuestionItems": [{
"_id": "1",
"select": true,
"score": NumberInt(100),
"content": "满意"
},
{
"_id": "2",
"select": false,
"score": NumberInt(80),
"content": "基本满意"
},
{
"_id": "3",
"select": false,
"score": NumberInt(60),
"content": "一般"
},
{
"_id": "4",
"select": false,
"score": NumberInt(40),
"content": "不太满意"
},
{
"_id": "5",
"select": false,
"score": NumberInt(20),
"content": "不满意"
}
]
},
{
"_id": "5",
"title": "5.您对本县(市、区)解决进城务工人员随迁子女就学问题的评价是:",
"basicQuestionItems": [{
"_id": "1",
"select": true,
"score": NumberInt(100),
"content": "满意"
},
{
"_id": "2",
"select": false,
"score": NumberInt(80),
"content": "基本满意"
},
{
"_id": "3",
"select": false,
"score": NumberInt(60),
"content": "一般"
},
{
"_id": "4",
"select": false,
"score": NumberInt(40),
"content": "不太满意"
},
{
"_id": "5",
"select": false,
"score": NumberInt(20),
"content": "不满意"
}
]
},
{
"_id": "6",
"title": "6. 您对本县(市、区)采取措施缩小城区与农村学校之间、学校与学校之间的办学条件差异是否满意?",
"basicQuestionItems": [{
"_id": "1",
"select": true,
"score": NumberInt(100),
"content": "满意"
},
{
"_id": "2",
"select": false,
"score": NumberInt(80),
"content": "基本满意"
},
{
"_id": "3",
"select": false,
"score": NumberInt(60),
"content": "一般"
},
{
"_id": "4",
"select": false,
"score": NumberInt(40),
"content": "不太满意"
},
{
"_id": "5",
"select": false,
"score": NumberInt(20),
"content": "不满意"
}
]
},
{
"_id": "7",
"title": "7.您对本县(市、区)中小学校校舍场所和设施设备改善情况的评价是:",
"basicQuestionItems": [{
"_id": "1",
"select": true,
"score": NumberInt(100),
"content": "满意"
},
{
"_id": "2",
"select": false,
"score": NumberInt(80),
"content": "基本满意"
},
{
"_id": "3",
"select": false,
"score": NumberInt(60),
"content": "一般"
},
{
"_id": "4",
"select": false,
"score": NumberInt(40),
"content": "不太满意"
},
{
"_id": "5",
"select": false,
"score": NumberInt(20),
"content": "不满意"
}
]
},
{
"_id": "8",
"title": "8.您对本县(市、区)在尊师重教,改善中小学教师(包括幼儿园、中职校和特殊学校教师)待遇方面的评价是:",
"basicQuestionItems": [{
"_id": "1",
"select": true,
"score": NumberInt(100),
"content": "满意"
},
{
"_id": "2",
"select": false,
"score": NumberInt(80),
"content": "基本满意"
},
{
"_id": "3",
"select": false,
"score": NumberInt(60),
"content": "一般"
},
{
"_id": "4",
"select": false,
"score": NumberInt(40),
"content": "不太满意"
},
{
"_id": "5",
"select": false,
"score": NumberInt(20),
"content": "不满意"
}
]
},
{
"_id": "9",
"title": "9.您对本县(市、区)中小学校长的选用、教师的聘用和校际交流工作是否满意? ",
"basicQuestionItems": [{
"_id": "1",
"select": true,
"score": NumberInt(100),
"content": "满意"
},
{
"_id": "2",
"select": false,
"score": NumberInt(80),
"content": "基本满意"
},
{
"_id": "3",
"select": false,
"score": NumberInt(60),
"content": "一般"
},
{
"_id": "4",
"select": false,
"score": NumberInt(40),
"content": "不太满意"
},
{
"_id": "5",
"select": false,
"score": NumberInt(20),
"content": "不满意"
}
]
},
{
"_id": "10",
"title": "10. 您对本县(市、区)在推进教学改革,发展素质教育,提高教育质量方面的评价是:",
"basicQuestionItems": [{
"_id": "1",
"select": true,
"score": NumberInt(100),
"content": "满意"
},
{
"_id": "2",
"select": false,
"score": NumberInt(80),
"content": "基本满意"
},
{
"_id": "3",
"select": false,
"score": NumberInt(60),
"content": "一般"
},
{
"_id": "4",
"select": false,
"score": NumberInt(40),
"content": "不太满意"
},
{
"_id": "5",
"select": false,
"score": NumberInt(20),
"content": "不满意"
}
]
},
{
"_id": "11",
"title": "11. 您对本县(市、区)重视中小学教师的业务培训和专业发展,提高教师教书育人、立德树人能力的评价是:",
"basicQuestionItems": [{
"_id": "1",
"select": true,
"score": NumberInt(100),
"content": "满意"
},
{
"_id": "2",
"select": false,
"score": NumberInt(80),
"content": "基本满意"
},
{
"_id": "3",
"select": false,
"score": NumberInt(60),
"content": "一般"
},
{
"_id": "4",
"select": false,
"score": NumberInt(40),
"content": "不太满意"
},
{
"_id": "5",
"select": false,
"score": NumberInt(20),
"content": "不满意"
}
]
},
{
"_id": "12",
"title": "12. 您对本县(市、区)做好中小学校、幼儿园的科学合理布局的评价是:",
"basicQuestionItems": [{
"_id": "1",
"select": true,
"score": NumberInt(100),
"content": "满意"
},
{
"_id": "2",
"select": false,
"score": NumberInt(80),
"content": "基本满意"
},
{
"_id": "3",
"select": false,
"score": NumberInt(60),
"content": "一般"
},
{
"_id": "4",
"select": false,
"score": NumberInt(40),
"content": "不太满意"
},
{
"_id": "5",
"select": false,
"score": NumberInt(20),
"content": "不满意"
}
]
},
{
"_id": "13",
"title": "13.您对本县(市、区)中小学校、幼儿园做好学校安全稳定工作是否满意?",
"basicQuestionItems": [{
"_id": "1",
"select": true,
"score": NumberInt(100),
"content": "满意"
},
{
"_id": "2",
"select": false,
"score": NumberInt(80),
"content": "基本满意"
},
{
"_id": "3",
"select": false,
"score": NumberInt(60),
"content": "一般"
},
{
"_id": "4",
"select": false,
"score": NumberInt(40),
"content": "不太满意"
},
{
"_id": "5",
"select": false,
"score": NumberInt(20),
"content": "不满意"
}
]
},
{
"_id": "14",
"title": "14.您对本县(市、区)中小学校长(含幼儿园园长)的管理水平、教师的教学水平是否满意?",
"basicQuestionItems": [{
"_id": "1",
"select": true,
"score": NumberInt(100),
"content": "满意"
},
{
"_id": "2",
"select": false,
"score": NumberInt(80),
"content": "基本满意"
},
{
"_id": "3",
"select": false,
"score": NumberInt(60),
"content": "一般"
},
{
"_id": "4",
"select": false,
"score": NumberInt(40),
"content": "不太满意"
},
{
"_id": "5",
"select": false,
"score": NumberInt(20),
"content": "不满意"
}
]
},
{
"_id": "15",
"title": "15.您对本县(市、区)中小学(含幼儿园)的教学质量是否满意?",
"basicQuestionItems": [{
"_id": "1",
"select": true,
"score": NumberInt(100),
"content": "满意"
},
{
"_id": "2",
"select": false,
"score": NumberInt(80),
"content": "基本满意"
},
{
"_id": "3",
"select": false,
"score": NumberInt(60),
"content": "一般"
},
{
"_id": "4",
"select": false,
"score": NumberInt(40),
"content": "不太满意"
},
{
"_id": "5",
"select": false,
"score": NumberInt(20),
"content": "不满意"
}
]
}
],
"platformId": "300417fe04e94eb9ac59807aa6db6bb2",
"platformVersionId": "96f9bb883e3e40a09eea69a1b5e2aaf0",
"projectId": "2c91128b5fa5b32c016010fb1fac111c",
"subProjectId": "2c91128b5fa5b32c016010fb1fb5111e"
}
数据结构
db.questionnaireSurvey.aggregate({"$unwind":"$basicQuestionnaireSurvey"},
{"$unwind":"$basicQuestionnaireSurvey.basicQuestionItems"},
{"$match":{"basicQuestionnaireSurvey.basicQuestionItems.select":{$eq:true}}},
{"$project":{qusetionId:"$basicQuestionnaireSurvey._id",
title:"$basicQuestionnaireSurvey.title",
satisfied: {$cond: { if: {$eq: ["$basicQuestionnaireSurvey.basicQuestionItems._id", "1" ] }, then: 1, else: 0 }},
basicSatisfaction:{$cond: { if: { $eq: ["$basicQuestionnaireSurvey.basicQuestionItems._id", "2" ] }, then: 1, else: 0 }},
commonly:{$cond: { if: { $eq: [ "$basicQuestionnaireSurvey.basicQuestionItems._id", "3" ] }, then: 1, else: 0 }},
notVerySatisfied:{$cond: { if: { $eq: [ "$basicQuestionnaireSurvey.basicQuestionItems._id", "4" ] }, then: 1, else: 0 }},
unSatisfied:{$cond: { if: { $eq: ["$basicQuestionnaireSurvey.basicQuestionItems._id", "5" ] }, then: 1, else: 0 }}
}},{"$group":{_id:{qusetionId:"$qusetionId",title:"$title"},satisfied:{$sum:"$satisfied"},
basicSatisfaction:{$sum:"$basicSatisfaction"},
commonly:{$sum:"$commonly"},
notVerySatisfied:{$sum:"$notVerySatisfied"},
unSatisfied:{$sum:"$unSatisfied"},
}}
);
sql
List<AggregationOperation> list = new ArrayList<>();
list.add(Aggregation.unwind("$basicQuestionnaireSurvey"));
list.add(Aggregation.unwind("$basicQuestionnaireSurvey.basicQuestionItems"));
list.add(Aggregation.match(Criteria.where("basicQuestionnaireSurvey.basicQuestionItems.select").is(true)));
list.add(Aggregation.project("_id").and("$basicQuestionnaireSurvey._id").as("questionId").and("$basicQuestionnaireSurvey.title").as("title").and(aggregationOperationContext -> {
DBObject condExpression = new BasicDBObject();
DBObject ifExpression = new BasicDBObject();
ifExpression.put("$eq", Arrays.asList("$basicQuestionnaireSurvey.basicQuestionItems.score", 100));
condExpression.put("if", ifExpression);
condExpression.put("then", 1);
condExpression.put("else", 0);
return new BasicDBObject("$cond", condExpression);
}).as("satisfied").and(aggregationOperationContext -> {
DBObject condExpression = new BasicDBObject();
DBObject ifExpression = new BasicDBObject();
ifExpression.put("$eq", Arrays.asList("$basicQuestionnaireSurvey.basicQuestionItems.score", 80));
condExpression.put("if", ifExpression);
condExpression.put("then", 1);
condExpression.put("else", 0);
return new BasicDBObject("$cond", condExpression);
}).as("basicSatisfaction").and(aggregationOperationContext -> {
DBObject condExpression = new BasicDBObject();
DBObject ifExpression = new BasicDBObject();
ifExpression.put("$eq", Arrays.asList("$basicQuestionnaireSurvey.basicQuestionItems.score", 60));
condExpression.put("if", ifExpression);
condExpression.put("then", 1);
condExpression.put("else", 0);
return new BasicDBObject("$cond", condExpression);
}).as("commonly").and(aggregationOperationContext -> {
DBObject condExpression = new BasicDBObject();
DBObject ifExpression = new BasicDBObject();
ifExpression.put("$eq", Arrays.asList("$basicQuestionnaireSurvey.basicQuestionItems.score", 40));
condExpression.put("if", ifExpression);
condExpression.put("then", 1);
condExpression.put("else", 0);
return new BasicDBObject("$cond", condExpression);
}).as("notVerySatisfied").and(aggregationOperationContext -> {
DBObject condExpression = new BasicDBObject();
DBObject ifExpression = new BasicDBObject();
ifExpression.put("$eq", Arrays.asList("$basicQuestionnaireSurvey.basicQuestionItems.score", 20));
condExpression.put("if", ifExpression);
condExpression.put("then", 1);
condExpression.put("else", 0);
return new BasicDBObject("$cond", condExpression);
}).as("unSatisfied").and(new AggregationExpression(){
@Override
public DBObject toDbObject(AggregationOperationContext context) { DBObject condExpression = new BasicDBObject();
DBObject ifExpression = new BasicDBObject();
ifExpression.put("$eq", Arrays.asList("$basicQuestionnaireSurvey.basicQuestionItems.score", 20));
condExpression.put("if", ifExpression);
condExpression.put("then", 1);
condExpression.put("else", 0);
return new BasicDBObject("$cond", condExpression); }
})
);
list.add(Aggregation.group("questionId", "title").sum("satisfied").as("satisfied").sum("basicSatisfaction").as("basicSatisfaction").sum("commonly").as("commonly").sum("notVerySatisfied").as("notVerySatisfied").sum("unSatisfied").as("unSatisfied")); Aggregation agg = Aggregation.newAggregation(list);
AggregationResults<MySyllabusAnswerCountKeyValue2> results = mongoTemplate.aggregate(agg, "questionnaireSurvey", MySyllabusAnswerCountKeyValue2.class);
results.getMappedResults();
java 代码
mongo aggregate 用法记录的更多相关文章
- Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!
Go/Python/Erlang编程语言对比分析及示例 本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性, ...
- 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil
封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,代码比较简单,主要是把MongoTarget的配置.FileTarget的配置集成到类中,同时利用缓存依赖来判断是否需要重新创 ...
- 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,nloglogutil
封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,代码比较简单,主要是把MongoTarget的配置.FileTarget的配置集成到类中,同时利用缓存依赖来判断是否需要重新创 ...
- pt-kill 用法记录
pt-kill 用法记录 # 参考资料Percona-Toolkit系列之pt-kill杀会话利器http://www.fordba.com/percona-toolkit-pt-kill.html ...
- CURL 用法记录
CURL 用法记录 在工作中经常需要用到curl 命令,记录一下常用的场景 Send a POST Request with JSON Data curl -d '{"login" ...
- mongo学习使用记录1
1 mongo的安装 1.添加MongoDB安装源 1.添加MongoDB安装源vim /etc/yum.repos.d/mongodb-enterprise.repo 将下列配置项写入文件 [mon ...
- mongo学习使用记录2 spring data
spring data mongo 打印mongo NoSql语句 log4j.properties log4j.rootLogger=INFO, stdout log4j.logger.org.sp ...
- C#累加器函数Aggregate用法 讲解
Enumerable.Aggregate 扩展方法在System.Linq命名空间中,是Enumerable类的第一个方法(按字母顺序排名),但确是Enumerable里面相对复杂的方法. MSDN对 ...
- mongo aggregate
https://cnodejs.org/topic/59264f62855efbac2cf7a2f3 背景 现有1000条学生记录,结构如下: { name:String,//名称 clazz:{ty ...
随机推荐
- JSON 简介
ylbtech-JSON: JSON 简介 JSON:JavaScript Object Notation(JavaScript 对象表示法) JSON是存储和交换文本信息的语法,类似 XML. JS ...
- 在Express中使用Multiparty进行文件上传及POST、GET参数获取
Express 版本:4.14.1 在Express中,文件上传需要用到multiparty中间件,在项目目录中,通过npm install multiparty –save进行安装必要组件. 前端H ...
- Zabbix 调整告警发送的内容格式
在配置动作区域 可以设置报警内容格式进行调整 原先告警内容 修改内容为: 后显示效果
- Python pip源处理
pypi 镜像使用帮助 pypi 镜像每 5 分钟同步一次. 临时使用 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-pac ...
- WireGuard协议介绍
原文: https://www.jianshu.com/p/32c3e62c2711
- [UE4]世界坐标和相对坐标
一.世界坐标:相对于整个世界的坐标 二.相对坐标是相对于组件父级的坐标.如下图: 1.Mesh组件和CameraPositionArrow组件的相对坐标是相对于Root组件的坐标 2.Cube组件的相 ...
- Linux聚合网络
Linux聚合网络 作者:Eric 微信:loveoracle11g 链路聚合 [root@server1 ~]# ifconfig | grep eno [root@server1 ~]# ls / ...
- jvm内存分区及各区线程问题
一.java内存模型图 二.直观分类图 三.各区简单描述 1.堆(heap):主要存放对象的实例也包括数组,是垃圾管理的主要作用区,是线程共享的 2.栈(stack):①虚拟机栈:描述的是 Java ...
- mysql表操作与权限操作
修改表ALTER TABLE 语法: . 修改表名 ALTER TABLE 表名 RENAME 新表名; . 增加字段 ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…], ...
- vuejs实现瀑布流布局(三)
前面写过vuejs实现的瀑布流布局,<vuejs实现瀑布流布局(一)>和<vuejs实现瀑布流布局(二)>也确实实现了瀑布流布局,但是这个是基于SUI-Mobile实现的无限滚 ...