1. 程式人生 > >MongoDB學習系列(二)mongo聚合查詢例項

MongoDB學習系列(二)mongo聚合查詢例項

mongoDB聚合查詢Java程式碼,小例項。

private void init(String year) throws Exception {
        if (year == null) {
            year = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()).substring(0, 4);
        } else {
            year = year.substring(0, 4);
        }
        // 當DB為null,或者db不是為需要的DB
        if (MongoDBUtil.getDB() == null || (!MongoDBUtil.getDB().getName().contains(year))) {
            db = MongoDBUtil.getDB(year);
            if (db == null) {
                log.error("mongo database connect failed!");
            }
        }
    }




private List<SemDto> getDetailResultsByCounts(BasicQuery basicQuery, Integer time) {
        AggregationOutput output = null;
        try {
            skipCount = 0;


            if (time == SemConstants.AccountTypeEnum.PRIOR.getIndex()) {
                init(basicQuery.getPriorEndDateStr());
            } else {
                init(basicQuery.getStartDateStr());
            }
            DBCollection collection = null;
            if (basicQuery.isFenYouXi()) {  
                collection = db.getCollection(IDEA_COLLECTION);
            } else {
                collection = db.getCollection(ACCOUNT_COLLECTION);
            }
            // match
            BasicDBObject con1 = new BasicDBObject();
            String startDate = null;
            String endDate = null;
            if (time == SemConstants.AccountTypeEnum.PRIOR.getIndex()) {
                startDate = basicQuery.getPriorStartDateStr();
                endDate = basicQuery.getPriorEndDateStr();
            } else {
                startDate = basicQuery.getStartDateStr();
                endDate = basicQuery.getEndDateStr();
            }
            BasicDBList accountIds = new BasicDBList();
            for (AccountDto accountDto : basicQuery.getAccountDtos()) {
                accountIds.add(accountDto.getAccountId());
            }
            con1.put("aid", new BasicDBObject(QueryOperators.IN, accountIds));
            // sd
            BasicDBObject[] array = {
                    new BasicDBObject("sd", new BasicDBObject(QueryOperators.GTE,
                            MongoOutputParse.parseStringToLong(startDate))),
                    new BasicDBObject("sd", new BasicDBObject(QueryOperators.LTE,
                            MongoOutputParse.parseStringToLong(endDate))) };
            con1.put("$and", array);
            if (basicQuery.getF() != SemConstants.AccountTypeEnum.ALL.getIndex()) {
                // 601-640 601640 660-690 660690
                if (basicQuery.getF().intValue() == 601640) {
                    BasicDBObject[] fs = { new BasicDBObject("f", new BasicDBObject(QueryOperators.GTE, 601l)),
                            new BasicDBObject("f", new BasicDBObject(QueryOperators.LTE, 640l)) };
                    con1.put("$and", fs);
                } else if (basicQuery.getF().intValue() == 660690) {
                    BasicDBObject[] fs = { new BasicDBObject("f", new BasicDBObject(QueryOperators.GTE, 660l)),
                            new BasicDBObject("f", new BasicDBObject(QueryOperators.LTE, 690l)) };
                    con1.put("$and", fs);
                } else {
                    con1.put("f", basicQuery.getF());
                }
            }
            if (basicQuery.isConsumeSelect() && basicQuery.getChannel() != SemConstants.AccountTypeEnum.ALL.getIndex()) {
                con1.put("ps", basicQuery.getChannel());
            }
            con1.put("tr", 0);
            DBObject match = new BasicDBObject("$match", con1);
            DBObject groupBy = null;
            if (basicQuery.isConsumeSelect() && basicQuery.isFenTian()) {
                groupBy = new BasicDBObject("sd", "$sd");
                groupBy.put("aid", "$aid");
                groupBy.put("f", "$f");
                groupBy.put("ps", "$ps");
            } else {
                groupBy = new BasicDBObject("aid", "$aid");
                groupBy.put("f", "$f");
                groupBy.put("ps", "$ps");
            }
            if (basicQuery.isFenYouXi()) {
                groupBy.put("iid", "$iid");
            }
            DBObject groupFields = new BasicDBObject("_id", groupBy);
            groupFields.put("cs", new BasicDBObject("$sum", "$cs"));
            groupFields.put("cl", new BasicDBObject("$sum", "$cl"));
            groupFields.put("pv", new BasicDBObject("$sum", "$pv"));
            groupFields.put("f", new BasicDBObject("$first", "$f"));
            groupFields.put("aid", new BasicDBObject("$first", "$aid"));
            groupFields.put("ps", new BasicDBObject("$first", "$ps"));
            if (basicQuery.isFenYouXi()) {
                groupFields.put("iid", new BasicDBObject("$first", "$iid"));
            }
            if (basicQuery.isConsumeSelect() && basicQuery.isFenTian()) {
                groupFields.put("sd", new BasicDBObject("$first", "$sd"));
            }
            DBObject group = new BasicDBObject("$group", groupFields);
            // sort
            DBObject sorts = new BasicDBObject();
            if (basicQuery.isConsumeSelect() && basicQuery.isFenTian()) {
                sorts.put("sd", 1);
                sorts.put("aid", 1);
            } else {
                sorts.put("aid", 1);
            }
            sorts.put("f", 1);
            if (basicQuery.isConsumeSelect()) {
                sorts.put("ps", 1);
            }
            if (basicQuery.isFenYouXi()) {
                sorts.put("iid", 1);
            }
            DBObject sort = new BasicDBObject("$sort", sorts);
            // skip
            DBObject skip = new BasicDBObject("$skip", skipCount);
            // limit
            DBObject limit = new BasicDBObject("$limit", COUNT_MONGO);
            // run aggregation
            output = collection.aggregate(match, group, sort, skip, limit);


            skipCount = parseArray(output, time, basicQuery.isFenYouXi(), basicQuery.isConsumeSelect(),
                    basicQuery.isFenTian());        
            while (skipCount == COUNT_MONGO) {
                output = collection
                        .aggregate(match, group, sort, new BasicDBObject("$skip", tempSemDtos.size()), limit);
                skipCount = parseArray(output, time, basicQuery.isFenYouXi(), basicQuery.isConsumeSelect(),
                        basicQuery.isFenTian());
            }
        } catch (Exception e) {
            log.error("data select failed!");
            e.printStackTrace();
        }
        return tempSemDtos;
    }