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 ...
随机推荐
- 百度地图api公交路线,IE下跳转百度地图后中文变成乱码的解决办法
百度开放的公交路线的链接,IE跳转会出现中文变成乱码的问题.如图: //创建InfoWindow function createInfoWindow() { var desDiv = []; desD ...
- es中的一些知识点记录
1. forcemerge接口 强制段合并,设置为1时,是期望最终只有1个索引段.但实际情况是,合并的结果是段的总数会减少,但仍大于1,可以多次执行强制合并的命令. 设置的的目标值越小.合并消耗的时间 ...
- win10配置labelImg
[引言]在目标检测中,需要用图像标注工具标注图像,如Labelme . labelImg等,本文使用的是LabelImg ,LabelImg在Ubuntu下很好部署, 在win10中有些地方要注意下, ...
- 2-自己动手写HashMap
public class Entry { // 键 private Object key; // 值 private Object value; //构造器 public Entry(Object k ...
- C,C#,Java:枚举类型
#include <stdio.h> main() { // 枚举默认从0开始,这里指定为1起头 , Tues, Wed, Thurs, Fri, Sat, Sun } day; scan ...
- 小众Python库介绍
Python 是世界上发展最快的编程语言之一.它一次又一次地证明了自己在开发人员和跨行业的数据科学中的实用性.Python 及其机器学习库的整个生态系统使全世界的用户(无论新手或老手)都愿意选择它.P ...
- SpringBoot在Kotlin中的实现(一)
本节记录如何用Kotlin初步搭建一个SpringBoot的环境(使用Gradle自动化构建工具). 1.新建一个Gradle的Kotlin 配置完成后,build.gradle的配置如下: buil ...
- Java GC如何判断对象是否为垃圾
查找内存中不再使用的对象 引用计数法 引用计数法就是如果一个对象没有被任何引用指向,则可视之为垃圾.这种方法的缺点就是不能检测到环的存在. 2.根搜索算法 根搜索算法的基本思路就是通过一系列名为”GC ...
- gentoo AR9285 BCM57780 安装驱动
首先使用启动光盘启动, 然后 mount /dev/sda4 /mnt/gentoo 挂载硬盘 lspci -v 1>/mnt/gentoo/root/lspci_v.txt 输出信息到文件. ...
- 22.Windows及linux下gerapy使用
Windows安装 gerapy1.pip install gerapy2.gerapy init 3.cd gerapy(切换目录到gerapy文件夹)4.gerapy migrate5.gerap ...