【问题标题】:Mongodb - get distinct values by date/time within the hourMongodb - 在一小时内按日期/时间获取不同的值
【发布时间】: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

我怎样才能做到这一点?

【问题讨论】:

    标签: mongodb distinct-values


    【解决方案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 还有。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 2015-05-18
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多