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

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

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

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

注释也写的非常清楚了

   @Override
    public PaginationResponseDTO<CustomMetricDTO> 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<Metric> matchingMetrics = mongoTemplate.find(query, Metric.class);

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

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

        List<CustomMetricDTO> 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<MetricData> metricDataResults = mongoTemplate.find(metricDataQuery, MetricData.class, collectionName);

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

            // 创建一个新的 metricDataList
            List<MetricDataDTO> 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);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值