• 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 代码
    多个字段分组的话,建议直接用Map去接收返回值 得到List<Map>

      

      

  • 相关阅读:
    团队项目冲刺第九天
    团队项目冲刺第八天
    团队项目冲刺第七天
    团队项目冲刺第六天
    vue-cli(vue脚手架)详细教程
    Ocelot+Consul 集群搭建实践
    docker部署net core项目
    nginx配置文件
    条码扫描器
    转载:MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息
  • 原文地址:https://www.cnblogs.com/jinjian91/p/9205443.html
Copyright © 2020-2023  润新知