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"}, }} );
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();
多个字段分组的话,建议直接用Map去接收返回值 得到List<Map>