MongoDB搜索实现Query-监控数据列表

需求逻辑:假如一个id为4399666,那么它对应的独立的文档名则为metricData_4399666,然后从这个文档中,然后拿到该文档中的createdAt字段来进行时间排序拿到前6个数据

总得来说就是,现从一个总得监控metric文档中拿到每一条metric的id;

然后再根据每个id去找到他们一一对应的metricData-id文档,然后根据时间排序拿到最新的六条数据;该接口预留了很多字段可以根据实际需求进一步编写来实现更精细化的搜索数据功能;

注释也写的非常清楚了

   @Override
    public PaginationResponseDTO listMetricData(String productId, String thingId, String metricId, Integer pageSize, Integer pageNum) {
        //拿到metric文档中所有的id,然后根据每一个metricId来去查询每一个对应的metricData文档的表拿到数据,
        // 构建查询条件 后续业务可能需要有搜索功能,所以直接采用Query来避免后续大的改动,适配性更高;
        Query query = new Query();

        // 添加其他搜索条件,例如 productId, thingId, metricId

        // 执行查询,获取符合条件的 Metric 文档列表
        List matchingMetrics = mongoTemplate.find(query, Metric.class);

        // 分页处理
        int startIdx = (pageNum - 1) * pageSize;
        int endIdx = Math.min(startIdx + pageSize, matchingMetrics.size());

        // 获取分页的 Metric 列表
        List pagedMetrics = matchingMetrics.subList(startIdx, endIdx);

        List customMetricDTOList = new ArrayList<>();

        for (Metric metric : pagedMetrics) {
            String currentMetricId = metric.getId(); // 获取当前 Metric 的 ID

            // 构建 metricData 文档的集合名
            String collectionName = "metricData_" + currentMetricId;

            // 查询每个 Metric ID 对应的 MetricData,按 createdAt 降序排序,限制返回结果数量为 6
            Query metricDataQuery = new Query()
                    .with(Sort.by(Sort.Order.desc("createdAt")))
                    .limit(6);

            // 执行查询,指定集合名
            List metricDataResults = mongoTemplate.find(metricDataQuery, MetricData.class, collectionName);

            // 将查询结果转换为 MetricDataDTO
            List metricDataDTOs = metricDataResults.stream()
                    .map(CustomMetricMapper.INSTANCE::toDTO)
                    .toList();

            // 创建一个新的 metricDataList
            List metricDataList = new ArrayList<>(metricDataDTOs);

            // 创建 CustomMetricDTO 并设置 metricData
            CustomMetricDTO customMetricDTO = new CustomMetricDTO();
            customMetricDTO.setMetricId(metric.getId());
            customMetricDTO.setMetricName(metric.getName());
            customMetricDTO.setMetricRn(metric.getRn());
            customMetricDTO.setMetricData(metricDataList);

            // 添加到结果列表
            customMetricDTOList.add(customMetricDTO);
        }

        // 构建分页响应
        return ResponseDTOBuilder.build(customMetricDTOList, customMetricDTOList.size(), pageSize, pageNum);
    }

你可能感兴趣的:(mongodb,java,开发语言,spring,cloud,idea)