mongodb - 聚合截断日期函数?

标签 mongodb date aggregation-framework truncate

我之前使用过很多 SQL 数据库;像 Postgres 和 BigQuery 一样,它们具有日期截断功能(例如: date_truncTIMESTAMP_TRUNC )。

我想知道mongodb是否有DATE_TRUNC函数?

我找到了$trunc运算符,但它仅适用于数字。

我想要一个 DATE_TRUNC 函数将给定的日期(其他 SQL 数据库中的时间戳类型)截断到特定的边界,例如年初、月初、小时开始,可以通过获取来组成新的日期年、月、日、时。

有人有某种解决方法吗?特别是对于 WEEK 的开始时刻和 ISOWEEK 的开始,有人有一个好的解决方法吗?

最佳答案

可以组合$dateToParts$dateFromParts

对于小时分钟:

db.getCollection("data").aggregate([
  {"$addFields": {
     "dateVarFull": {"$dateToParts": {date: {"$toDate" : "2020-08-27T13:00:00Z"}}}
  }},
  {"$addFields": {
    "dateVarTrunc": { "$dateFromParts": {
      'year': "$dateVarFull.year",
      'month': "$dateVarFull.month",
      'day': "$dateVarFull.day"
    }}
  }}
])

结果:

{
    "dateVarFull" : {
        "year" : NumberInt(2020), 
        "month" : NumberInt(8), 
        "day" : NumberInt(27), 
        "hour" : NumberInt(13), 
        "minute" : NumberInt(0), 
        "second" : NumberInt(0), 
        "millisecond" : NumberInt(0)
    }, 
    "dateVarTrunc" : ISODate("2020-08-27T00:00:00.000+0000")
}

对于week trunc 使用iso8601: true 参数:

db.getCollection("data").aggregate([
  {"$addFields": {
    "dateVarFull": {
       "$dateToParts": {
         date: {"$toDate" : "2020-08-27T13:00:00Z"},
         iso8601: true
       }
    }
  }},
  {"$addFields": {
    "dateVarTrunc": { "$dateFromParts": {
      'isoWeekYear': "$dateVarFull.isoWeekYear",
      'isoWeek': "$dateVarFull.isoWeek",
      'isoDayOfWeek': 1
    }}
  }}
])

结果:

{
    "dateVarFull" : {
        "isoWeekYear" : NumberInt(2020), 
        "isoWeek" : NumberInt(35), 
        "isoDayOfWeek" : NumberInt(4), 
        "hour" : NumberInt(13), 
        "minute" : NumberInt(0), 
        "second" : NumberInt(0), 
        "millisecond" : NumberInt(0)
    }, 
    "dateVarTrunc" : ISODate("2020-08-24T00:00:00.000+0000")
}

关于mongodb - 聚合截断日期函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48351590/

相关文章:

python - Sklearn.KMeans() : Get class centroid labels and reference to a dataset

mongodb - 加入两个数组的相关属性

javascript - 使用 mongodb 制作具有排序和分页功能的动态联系人聊天列表

java - MongoDB-Java:如何使 $geoNear 首先进行查询,然后进行距离?

javascript - 使用 Node.js 设置 MongoDB 数据库连接

javascript - 使用 Mongoose 进行软删除不起作用

android - 如何在android中计算最后一个日期收件箱短信

python - 在 Python 中从日期时间获取日期

javascript - 从数组内部计算每个键的不同值

node.js - 在node.js-mongodb中分组