Ver código fonte

mongo多个时间范围查询优化

qiangxuan 6 meses atrás
pai
commit
9c2a189f6a

+ 24 - 10
jeecg-module-gather/src/main/java/org/jeecg/modules/leanEventWarn/service/impl/LeanEventWarnInfoServiceImpl.java

@@ -458,19 +458,19 @@ public class LeanEventWarnInfoServiceImpl extends ServiceImpl<LeanEventWarnInfoM
      */
     public List<FpgStatiscsModelMongodb> queryByTimeRanges(MongoTemplate mongoTemplate, List<Date[]> timeRanges, String devicePointId, String deviceInformationId, String deviceRegionId) {
         Query query = new Query();
-//        String devicePointIds = Arrays.stream(devicePointId.split(",")).collect(Collectors.joining("|"));
-//        // 设置devicePointId的查询条件,使用正则表达式
-//        query.addCriteria(Criteria.where("devicePointId").regex(devicePointIds));
         query.addCriteria(Criteria.where("deviceInformationId").is(deviceInformationId));
         query.addCriteria(Criteria.where("deviceRegionId").is(deviceRegionId));
         // 使用Criteria添加多个时间范围条件
-        for (int i = 0; i < timeRanges.size(); i++) {
-            Date startTime = timeRanges.get(i)[0];
-            Date endTime = timeRanges.get(i)[1];
-            // 加8小时
-            Date specifiedTimePlus8HoursStartTime = DateUtils.addHours(startTime, 8);
-            Date specifiedTimePlus8HoursStartEndTime = DateUtils.addHours(endTime, 8);
-            query.addCriteria(Criteria.where("createTime").gte(specifiedTimePlus8HoursStartTime).lt(specifiedTimePlus8HoursStartEndTime));
+        List<Criteria> criteriaList = new ArrayList<>();
+        for (Date[] timeRange : timeRanges) {
+            Criteria criteria = buildTimeRangeCriteria(timeRange);
+            criteriaList.add(criteria);
+        }
+        if (criteriaList.size() > 1) {
+            Criteria[] criteriaArray = criteriaList.toArray(new Criteria[0]);
+            query.addCriteria(new Criteria().orOperator(criteriaArray));
+        } else if (criteriaList.size() == 1) {
+            query.addCriteria(criteriaList.get(0));
         }
         log.info("{}{}", "查询FpgStatiscsModelMongodb模型参数:", query);
         // 执行查询
@@ -544,4 +544,18 @@ public class LeanEventWarnInfoServiceImpl extends ServiceImpl<LeanEventWarnInfoM
         return createTime!= null && (createTime.isAfter(start_time) || createTime.equals(start_time)) &&
                 (createTime.isBefore(end_time) || createTime.equals(end_time));
     }
+
+    /**
+     * 辅助方法,用于根据给定的时间范围构建Criteria,并加上8小时
+     * @param timeRange
+     * @return
+     */
+    private Criteria buildTimeRangeCriteria(Date[] timeRange) {
+        Date startTime = timeRange[0];
+        Date endTime = timeRange[1];
+        // 加8小时
+        Date startTimePlus8Hours = DateUtils.addHours(startTime, 8);
+        Date endTimePlus8Hours = DateUtils.addHours(endTime, 8);
+        return Criteria.where("createTime").gte(startTimePlus8Hours).lte(endTimePlus8Hours);
+    }
 }