执行语句对应的java实现如下(这里是用springdata,非DBobject):
1.分组算合
首先表数据是这样的
{
"_id" : ObjectId("5c46e839349d712004652ab4"),
"ORG_CODE" : "436044",
"DATE" : "2019-01-21",
"ALL_CHECKED_NUM" : NumberLong(0),
"WARNING_NUM" : NumberLong(0),
"WARNING_NUM_BIG" : NumberLong(0),
"WARNING_NUM_SMALL" : NumberLong(0),
"WARNING_PERCENT" : "0",
"LAST_STATISTICS_TIME" : "2019-01-22 23:59:00"
}
{
"_id" : ObjectId("5c46e839349d712004652ab6"),
"ORG_CODE" : "436044",
"DATE" : "2019-01-22",
"ALL_CHECKED_NUM" : NumberLong(0),
"WARNING_NUM" : NumberLong(0),
"WARNING_NUM_BIG" : NumberLong(0),
"WARNING_NUM_SMALL" : NumberLong(0),
"WARNING_PERCENT" : "0",
"LAST_STATISTICS_TIME" : "2019-01-23 10:34:00"
}
要求:根据org_code分组,算ALL_CHECKED_NUM,WARNING_NUM,WARNING_NUM_BIG,WARNING_NUM_SMALL各自的总和
db.t_statistics_checked_info.aggregate([{$match:{DATE:{$gte:"2019-01-20",$lte:"2019-02-19"}}},{$group:{_id:"$ORG_CODE",ALL_CHECKED_NUM:{$sum:"$ALL_CHECKED_NUM"},WARNING_NUM:{$sum:"$WARNING_NUM"},WARNING_NUM_BIG:{$sum:"$WARNING_NUM_BIG"},WARNING_NUM_SMALL:{$sum:"$WARNING_NUM_SMALL"}}}])
java代码怎么写呢。。
public List<CheckedInfoStatistics> querySumByOrg(Map<String, Object> params){
List<AggregationOperation> operations = new ArrayList<>();
if(params != null && params.size()>0){
if (StringUtils.isNotNull(String.valueOf(params.get("ORG_CODE")))) {
List<String> orgCodes = Arrays.asList(params.get("ORG_CODE").toString().split(","));
operations.add(Aggregation.match(Criteria.where("ORG_CODE").in(orgCodes)));
}
if(StringUtils.isNotNull(String.valueOf(params.get("startTime")))
&& StringUtils.isNotNull(String.valueOf(params.get("endTime")))){
operations.add(Aggregation.match(Criteria.where("DATE").gte(params.get("startTime")).lte(params.get("endTime"))));
}
}
operations.add(Aggregation.group("ORG_CODE")
.sum("ALL_CHECKED_NUM").as("ALL_CHECKED_NUM")
.sum("WARNING_NUM").as("WARNING_NUM")
.sum("WARNING_NUM_BIG").as("WARNING_NUM_BIG")
.sum("WARNING_NUM_SMALL").as("WARNING_NUM_SMALL"));
Aggregation aggregation = Aggregation.newAggregation(operations);
AggregationResults<CheckedInfoStatistics> resultCount = mongoTemplate.aggregate(aggregation,"t_statistics_checked_info",CheckedInfoStatistics.class);
List<CheckedInfoStatistics> list = resultCount.getMappedResults();
return list;
}
CheckedInfoStatistics是根据我需要的字段建的一个结果集类,字段名字要和你查出来的结果字段名字一样。
还要注意一点,Aggregation.add是有顺序的,写前面就先执行了。
2.根据CREATOR进行分组,并显示一个分组统计条件之外的一个字段,以下例子是ORG_CODE。
operations.add(Aggregation.group("CREATOR").count().as("collectSum").first("ORG_CODE").as("ORG_CODE"));
3.分页
if(StringUtils.isNotNull(String.valueOf(params.get("page")))
&& StringUtils.isNotNull(String.valueOf(params.get("limit")))) {
int page = Integer.valueOf(String.valueOf(params.get("page")));
int limit = Integer.valueOf(String.valueOf(params.get("limit")));
Aggregation.skip(page > 1 ? (page - 1) * page : 0L);
Aggregation.limit(limit);
}
4.模糊查询
operations.add(Aggregation.match(Criteria.where("CREATOR").regex(".*?" + params.get("CREATOR") + ".*")));
5.可以选择性的显示查询出来的字段
operations.add(Aggregation.project("CREATOR","collectSum","org"));
执行语句是:
"$project": {
"CREATOR": "$_id.CREATOR",
"collectSum": 1,
"ORG_CODE": 1
}
如果是-1,表示不显示
6.根据分组后的字段排序
operations.add(Aggregation.sort(Sort.Direction.DESC,"collectSum"));