mongo aggregate 用法记录

Posted jinjian91

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 用法记录的主要内容,如果未能解决你的问题,请参考以下文章

记录一次 MongoDB aggregate的性能优化经历

mongo_aggregate() 的 Djongo 映射器问题

Mongo:将返回的记录限制为切片的增量计数

javascript Mongo Group Aggregate

Mongo DB删除重复数据文档实践

mongo14-----group???aggregate???mapReduce