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 ...
随机推荐
- MATLAB在三维坐标中显示图片 并 使得图片部分透明
要画一个光路图,本来可以用proe,但是鼠标不好用,有些操作也忘了,用MATLAB画了个.下面是用到的图片. 但是三维坐标中显示彩色图片的目标没有搞定,做了个灰度图,然后用仿射程序将彩色图片贴到了二维 ...
- 廖雪峰Java2面向对象编程-2数据封装-1方法
1.数据封装 一个class可以包含多个field.直接把field用public暴露给外部可能破坏了封装,例如传入不合理的数值(年龄填入1000).如下 public class Person { ...
- 如何使用Python操纵Postgres数据库
pip install psycopg2 psycopg2-binary #!/usr/bin/python import psycopg2conn = psycopg2.connect(databa ...
- java eclipse maven The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path 解决方法
在eclipse 中使用maven 创建java web项目,启动服务器遇到提示:The superclass "javax.servlet.http.HttpServlet" w ...
- ubuntu 16.04 启用root用户方法,SSH允许root登陆
1.使用:sudo passwd root设置root的密码,如下图所示: 2.使用su root来测试是否可以进入root用户,如果出现#说明已经设置root用户的密码成功,如下图所示: 3.进入到 ...
- SpringBoot项目启用本地Tomcat
1.修改pom.xml文件,配置<packaging>war</packaging>,使其发布的时候打包成war包 <groupId>com.owlforest&l ...
- 【死磕 Spring】—— IoC 之加载 BeanDefinition
本文主要基于 Spring 5.0.6.RELEASE 摘要: 原创出处 http://cmsblogs.com/?p=2658 「小明哥」,谢谢! 作为「小明哥」的忠实读者,「老艿艿」略作修改,记录 ...
- centos7 图形化界面
当你安装centos服务器版本的时候,系统默认是不会安装 CentOS 的图形界面程序的,比如:gnome或者kde, 那么如果你想在图形界面下工作的话,可以手动来安装CentOS Gnome GUI ...
- qt 软件打包
今天呈现的客户端完成了要打包发布,想了一下还不会,就问了一下度娘,在此记录一下学习的程度 1>将QT编译工具的BUG模式切换成Release模式,在Release模式下生成一个*.exe的可执行 ...
- 【Selenium-WebDriver自学】Selenium-IDE测试创建(三)
==================================================================================================== ...