List<BasicDBObject> aggregateCondList = new ArrayList<>();
BasicDBObject queryParam = new BasicDBObject("alarmTime", new BasicDBObject("$gte", param.getStartTime()).append("$lt", param.getEndTime()));
if (StringUtils.isNotBlank(param.getDeviceName())) {
// 忽略大小写匹配设备名称
queryParam.append("deviceName", new BasicDBObject("$regex", Pattern.compile(String.format("^.*%s.*$", param.getDeviceName()), Pattern.CASE_INSENSITIVE)));
}
if (param.getDistrictId() != null) {
queryParam.append("districtId", param.getDistrictId());
}
if (StringUtils.isNotBlank(param.getDeviceGroupId())) {
queryParam.append("deviceGroupId", param.getDeviceGroupId());
}
BasicDBObject match = new BasicDBObject("$match",queryParam);
aggregateCondList.add(match);
// 格式化日期
aggregateCondList.add(new BasicDBObject("$project", new BasicDBObject("time", new BasicDBObject("$dateToString", new BasicDBObject("format", "%Y-%m" + (Objects.equals(param.getRange(), "year") ? "" : "-%d")).append("date", "$alarmTime")))));
// 按$project分组
aggregateCondList.add(new BasicDBObject("$group", new BasicDBObject("_id", "$time").append("count", new BasicDBObject("$sum", 1))));
// [{ "_id":"2022-08-16", "count":137 },{ "_id":"2022-08-17", "count":18 }]
MongoCursor<Document> cursor = mongoTemplate.getCollection("alarmMessage").aggregate(aggregateCondList).iterator();