// 根据条件查询
Criteria criteria = Criteria.where("taskId").exists(true);
if (failTaskQueryVo.getChannelName() != null && !"".equals(failTaskQueryVo.getChannelName())) {
criteria.and("channelType").is(failTaskQueryVo.getChannelName());
}
// 时间(这里必须开始时间跟结束时间写一起,否则会报错)
if (failTaskQueryVo.getPushStartTime() != null && !"".equals(failTaskQueryVo.getPushStartTime())
&& failTaskQueryVo.getPushEndTime() != null && !"".equals(failTaskQueryVo.getPushEndTime())) {
criteria.and("createTime").gt(failTaskQueryVo.getPushStartTime()).lt(failTaskQueryVo.getPushEndTime());
}
Aggregation agg = Aggregation.newAggregation(
// 条件
Aggregation.match(criteria),
// 分组字段以及其他分组后要展示的字段
Aggregation.group("taskId").count().as("failCount")
.last("channelType").as("channelType")
.last("createTime").as("createTime")
.last("message.msgTitle").as("msgTitle")
.last("message.msgSummary").as("msgSummary")
.last("message.msgContent").as("msgContent")
.last("message.sendGroupType").as("sendGroupType"),
// 分页
Aggregation.skip(failTaskQueryVo.getPageNum() > 1 ? (failTaskQueryVo.getPageNum() - 1) * failTaskQueryVo.getPageSize() : 0L),
Aggregation.limit(failTaskQueryVo.getPageSize()),
// 最终要展示的字段
Aggregation
.project("failCount", "channelType", "createTime", "msgTitle", "msgSummary", "msgContent",
"sendGroupType")
// 重命名taskId
.andExclude("_id").and("_id").as("taskId")
// 格式化时间
.andExpression("{$dateToString:{format:'%Y-%m-%d %H:%M:%S',date:'$createTime',timezone: 'Asia/Shanghai'}}")
.as("createTime"));
AggregationResults<Map> results = mongoTemplate.aggregate(agg, "msgTaskUserFailCollection", Map.class);
List<Map> failMsgList = new ArrayList<>();
SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
for (Map map : results) {
// 处理时间
Date date = (Date) map.get("createTime");
map.put("createTime", sdf.format(date));
failMsgList.add(map);
}
springboot+mongodb 根据条件分组分页查询
2019.05.17:由于MongoDB默认时间是utc时间,返回前台的数据需要做处理;另外,如果查询条件有时间区间的话,不需要做转换,MongoDB会自动转为utc时间处理