这知识怎么不进脑子啊 2023-06-27 09:23 采纳率: 75%
浏览 88
已结题

mongoTemplate如何查询多个时间段平均值

比如有如下数据:

_idtimevalue
12023-06-20 00:00:0024
22023-06-21 23:00:0012
32023-06-22 12:43:13345
42023-06-23 13:35:3435
52023-06-24 17:34:1246
62023-06-25 00:00:0068
72023-06-26 12:44:34464
82023-06-27 00:00:0024
92023-06-28 00:00:0067
102023-06-29 00:00:0024

我有一个List数组作为查询条件,里面有一组时间段,比如:
TimeRange

Date startTime;
Date endTime;

现在我需要查询出多个时间段的平均值,并能将平均值与时间段相匹配,比如:
时间段1:2023-06-19 00:00:00 ~ 2023-06-21 23:59:59
时间段2:2023-06-23 00:00:00 ~ 2023-06-25 23:59:59
时间段2:2023-06-27 00:00:00 ~ 2023-06-29 23:59:59

若得到的最终结果存入map,则最终结果应该是

{
    "2023-06-19 00:00:00~2023-06-21 23:59:59":18,
    "2023-06-23 00:00:00~2023-06-25 23:59:59":49.67,
    "2023-06-27 00:00:00~2023-06-29 23:59:59":38.33
}

我该如何使用mongoTemplate实现这种聚合?
目前我是使用循环查询,但是实在影响性能,有什么一次性就查出的方法吗?

在网上找了很多资料,包括chatGPT问了很多,都没有可行的手段,但从逻辑上看来是个简单问题,希望得到帮助,谢谢各位!

  • 写回答

5条回答 默认 最新

  • 青霄 2023-06-27 22:23
    关注

    1、mongo插入数据:

    db.getCollection("artists").insertMany([
      { "_id" : 1, "time":new Date("2023-06-20 00:00:00") , "value":NumberInt(24)},
      { "_id" : 2, "time":new Date("2023-06-21 23:00:00") , "value":NumberInt(12)},
      { "_id" : 3, "time":new Date("2023-06-22 12:43:13") , "value":NumberInt(345)},
      { "_id" : 4, "time":new Date("2023-06-23 13:35:34") , "value":NumberInt(35)},
      { "_id" : 5, "time":new Date("2023-06-24 17:34:12") , "value":NumberInt(46)},
      { "_id" : 6, "time":new Date("2023-06-25 00:00:00") , "value":NumberInt(68)}, 
      { "_id" : 7, "time":new Date("2023-06-26 12:44:34") , "value":NumberInt(464)},
      { "_id" : 8, "time":new Date("2023-06-27 00:00:00") , "value":NumberInt(24)}, 
      { "_id" : 9, "time":new Date("2023-06-28 00:00:00") , "value":NumberInt(67)},
      { "_id" : 10, "time":new Date("2023-06-29 00:00:00") , "value":NumberInt(24)}, 
    ])
    

    2、库中查询,由于存储UTC时间,比实际少8小时

    img

    3、求多个时间段的平均值

    db.getCollection("artists").aggregate([
           {'$bucket':{
               groupBy: "$time",
               boundaries: [ new Date("2023-06-19 00:00:00"), new Date("2023-06-21 23:59:59"), new ISODate("2023-06-23 00:00:00"), new ISODate("2023-06-25 23:59:59"), new Date("2023-06-27 00:00:00"), new Date("2023-06-29 23:59:59") ],   // Boundaries for the buckets
               default: "other",
               output: {   
                  "count": { $sum: 1 },
                  "values":{'$push':"$value"},
                  "total_value": {'$sum':"$value"},
                  "artists":{
                      '$push':{
                          "vakue": "$value",
                          "time": "$time"
                      }
                  }
              }
           }},
           
           {'$project':{
               "values": 1,
               "average": {'$divide':["$total_value", "$count"]},
           }}
    ])
    

    结果:

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 7月7日
  • 已采纳回答 6月29日
  • 创建了问题 6月27日

悬赏问题

  • ¥15 C++ 句柄后台鼠标拖动如何实现
  • ¥15 有人会SIRIUS 5.8.0这个软件吗
  • ¥30 comsol仿真等离激元
  • ¥15 静电纺丝煅烧后如何得到柔性纤维
  • ¥15 (标签-react native|关键词-镜像源)
  • ¥100 照片生成3D人脸视频
  • ¥15 伪装视频时长问题修改MP4的时长问题,
  • ¥15 JETSON NANO
  • ¥15 VS开发qt时如何在paintgl函数中用pushbutton控制切换纹理
  • ¥20 关于 openpyxl 处理excel文件地问题