spring-data-mongodb --分组分页查询
在项目实际应用中记录mongodb分组分页查询操作
注意:
- MongoDB默认时间是utc时间,返回前端的数据需要做处理
- 如果查询条件有时间区间的话,不需要做转换,MongoDB会自动转为utc时间处理
代码:
// 根据条件查询Criteriacriteria=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()); } Aggregationagg=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=newArrayList<>(); SimpleDateFormatsdf=newSimpleDateFormat("yyy-MM-dd HH:mm:ss"); for (Mapmap : results) { // 返回前端处理时间Datedate= (Date) map.get("createTime"); map.put("createTime", sdf.format(date)); failMsgList.add(map); }