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 ...
随机推荐
- 从知名外企到创业公司做CTO是一种怎样的体验?
这是我近期接受51CTO记者李玲玲采访的一篇文章,分享给大家. 作者:李玲玲来源:51cto.com|2016-12-30 15:47 http://cio.51cto.com/art/201612/ ...
- [UE4]图片按钮设置技巧
- Centos7 配置ssh连接
Centos7 配置ssh连接 1.检查是否安装openssh-server:#yum list installed | grep openssh-server 安装openssh-server:#y ...
- (转)Linux 系统服务的启动顺序解析 rc.*
介绍系统按照不同级别启动时需要启动的服务. 进入目录:etc 执行命令:ls -l | grep "rc.*" | sort 结果如下图: 1 系统在启动时,通过inittab ...
- MariaDB MaxScale
1. down https://mariadb.com/downloads/#mariadb_platform-mariadb_maxscale (1) install sudo yum locali ...
- scrapy框架之CrawlSpider操作
提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法二:基 ...
- centos7 真实机安装后没有网卡解决办法
我们在真实机安装完centos7版本后,会发现没有网卡,只有lo口 因为真实机不同你在虚拟机里面,这个时候我们不能连网,更加不要说配置什么静态ip了 是什么原因呢,是因为有些真实机安装了centos系 ...
- MVP与MVC的区别
MVP的主要思想就是解耦View和Model 先大致从图上看一下MVP和MVC又什么不同: MVC: M : Model 数据模型,就是对数据的封装和保存: V : View 视图界面,相当于布局文件 ...
- Python ————反射机制
python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删除成员. ...
- 使用RestTemplate在代码内调用POST请求的参数乱码问题
背景:在项目A代码内部,调用项目B的restful接口C,我们采用了RestTemplate进行调用,但是调用过程中,一直不能正常返回数据,日志显示参数存在乱码(有个参数的值是中文) 乱码原因:请求方 ...