MongoDB格式化日期后分组,Java实现

        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();
posted @ 2022-08-26 15:39  搬运工001  阅读(324)  评论(0)    收藏  举报