SpringBoot集成spring-data-mongodb 根据条件分组分页查询

        // 根据条件查询
		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 results = mongoTemplate.aggregate(agg, "msgTaskUserFailCollection", Map.class);

		List 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时间处理

你可能感兴趣的:(SpringBoot集成spring-data-mongodb 根据条件分组分页查询)