• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

java MongoDB DateToString按时间分组查询

武飞扬头像
xxxguccimaince
帮助1

项目场景:

mongodb中的数据按时间进行分组统计,mongodb中时间存储的是秒级时间戳格式


问题描述

最开始查阅博客, 想用project().andExpression()的方式将mongodb语句的dateToString直接放入

  1.  
    ProjectionOperation projectionOperation1 = project().andExpression("{
  2.  
                    "$dateToString": {
  3.  
                        "format": "%Y-%m-%d", //按天查询
  4.  
                        "timezone": "Asia/Shanghai", //上海时区
  5.  
                        "date": {
  6.  
                             "$convert":{ //时间戳转日期
  7.  
    //因为存储的是秒级时间戳要*1000转换为毫秒
  8.  
                             'input' : {'$multiply': ['$created_at', 1000] },
  9.  
                                     //要转换为的类型 
  10.  
      "to": "date"
  11.  
                               }
  12.  
                        }
  13.  
                    }
  14.  
                }").as("date");
  15.  
    GroupOperation groupOperation = Aggregation.group("date").count().as("totalCount");
  16.  
    TypedAggregation<Machine> typedAggregation = Aggregation.newAggregation(Machine.class,
  17.  
    matchOperation,projectionOperation1, groupOperation);
  18.  
    AggregationResults<Map> onlyMachineCountResults = mongoTemplate.aggregate(typedAggregation,
  19.  
    Map.class);
学新通

原因分析:

project().andExpression() 无法解析成完整的mongodb语句 查阅资料发现是andExpression会过滤掉$


解决方案:

使用springframework.data.mongodb中提供的方法解决问题

找到multiply,convert,dateToString 对应的方法解决问题

  1.  
    //{'$multiply': ['$created_at', 1000] }
  2.  
    ArithmeticOperators.Multiply multiply =
  3.  
    ArithmeticOperators.Multiply.valueOf("createdTime").multiplyBy(1000);
  4.  
    //"$convert"
  5.  
    ConvertOperators.Convert date = ConvertOperators.Convert.convertValue(multiply).to("date");
  6.  
    DateOperators.DateToString dateToString =
  7.  
    //"$dateToString": {"format": "%Y-%m-%d" "timezone": "Asia/Shanghai",}
  8.  
    DateOperators.DateToString.dateOf(date).toString(format).withTimezone(DateOperators.Timezone.valueOf("Asia/Shanghai"));
  9.  
    ProjectionOperation projectionOperation1 = project().and(dateToString).as("date");
  10.  
    GroupOperation groupOperation = Aggregation.group("date").count().as("totalCount");
  11.  
     
  12.  

希望可以对大家有帮助!

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgcgjgh
系列文章
更多 icon
同类精品
更多 icon
继续加载