需求逻辑:假如一个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);
}