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;
}