Mongodb - 在一小时内按日期/时间获取不同的值

Posted

技术标签:

【中文标题】Mongodb - 在一小时内按日期/时间获取不同的值【英文标题】:Mongodb - get distinct values by date/time within the hour 【发布时间】:2021-11-18 00:48:04 【问题描述】:

如果我想要求一个独特的价值观,我可以这样做:

db.getCollection('cars').distinct('deparutre_date')

结果:

2021-05-03 15:59:15.530Z
2021-05-03 15:59:24.534Z
2021-05-03 15:59:33.537Z
2021-05-03 15:59:38.537Z
2021-05-03 15:59:40.536Z
2021-05-03 14:28:41.530Z

但是,我希望按小时获得不同的值,所以上面应该显示如下内容:

2021-05-03 15:00:00.000Z
2021-05-03 14:00:00.000Z

我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

查询

分组方式 日期的年份 (1-12) 一年中的某天(1-366) 一天中的小时(0-23) 只保留 1 个日期(无论如何,所有日期都将具有相同的年/月/日/小时) 项目使用我们已有的字段恢复日期, 我们曾经分组的那些

*所有这些运算符还有可选的timezone: <tzExpression>

Test code here

db.collection.aggregate([
  
    "$group": 
      "_id": 
        "year": 
          "$year": "$date"
        ,
        "day-of-year": 
          "$dayOfYear": "$date"
        ,
        "hour": 
          "$hour": "$date"
        
      ,
      "date": 
        "$first": "$date"
      
    
  ,
  
    "$project": 
      "_id": 0,
      "date": 
        "$dateFromParts": 
          "year": "$_id.year",
          "day": "$_id.day-of-year",
          "hour": "$_id.hour"
        
      
    
  
])

查询2 (较短的版本 >= MongoDB v5,正如 Wernfried Domschei 在评论中所建议的那样)

Test code here

db.collection.aggregate([
  
    "$set": 
      truncatedOrderDate: 
        $dateTrunc: 
          date: "$date",
          unit: "hour",
          timezone: "America/Los_Angeles"
        
      
    
  ,
  
    "$group": 
      "_id": "$truncatedOrderDate",
      
    
  
])

【讨论】:

如果您运行 MongoDB 5.0 或更高版本,您可以使用更短的_id: $dateTrunc: date: "$date", unit: "hour" @ Wernfried Domschei 您介意分享一个答案,您将如何使用 dateTrunc 进行操作。我对此有过一些挣扎。谢谢! 我添加了一个$dateTrunc 解决方案,但我认为它们都做同样的事情,如果你有一个不起作用的例子,如果你能发布数据 上述组相同的年+月+日+小时,如果你只想要按小时,忽略年/月/日,它更简单,从你的样本数据我假设你想要年+month+day+hour 还有。

以上是关于Mongodb - 在一小时内按日期/时间获取不同的值的主要内容,如果未能解决你的问题,请参考以下文章

如何在一系列月份内按日期打印工作日的日期(不是周末)?

Mongodb,按日期差异分组并获取小时

PySpark:在日期为字符串的范围内按日期字段过滤DataFrame

(Pyspark - 在一段时间内按用户分组

javascript MongoDB在一小时之间获得

在日期范围内按日期聚合数据,结果集中没有日期间隔