$dateTrunc

表达式 $dateTrunc 运算符将日期截断到最近的指定单位(例如小时、日、月)。 在处理时序数据或按特定时间间隔对数据进行分组时非常有用。 此运算符可用于简化和标准化日期计算。

Syntax

  $dateTrunc: {
    date: <dateExpression>,
    unit: "<unit>",
    binSize: <number>,       // optional
    timezone: "<timezone>",  // optional
    startOfWeek: "<day>"     // optional (used when unit is "week")
  }

参数

参数 Description
date 要截断的日期。
unit 要截断日期到的单位。 支持的值包括year、、、、monthweekdayhour、和minutesecondmillisecond
binSize (可选)用于截断的每个箱的大小。 例如,如果binSize为 2,则unithour日期将截断为每 2 小时一次。
timezone (可选)要用于截断的时区。 如果未指定,则默认为 UTC。

Example

让我们了解 stores 数据集中的示例 json 的用法。

{
  "_id": "e6410bb3-843d-4fa6-8c70-7472925f6d0a",
  "name": "Relecloud | Toy Collection - North Jaylan",
  "location": {
    "lat": 2.0797,
    "lon": -94.4134
  },
  "staff": {
    "employeeCount": {
      "fullTime": 7,
      "partTime": 4
    }
  },
  "sales": {
    "salesByCategory": [
      {
        "categoryName": "Educational Toys",
        "totalSales": 3299
      }
    ],
    "revenue": 3299
  },
  "promotionEvents": [
    {
      "eventName": "Massive Markdown Mania",
      "promotionalDates": {
        "startDate": {
          "Year": 2024,
          "Month": 9,
          "Day": 21
        },
        "endDate": {
          "Year": 2024,
          "Month": 9,
          "Day": 29
        }
      },
      "discounts": [
        {
          "categoryName": "Remote Control Toys",
          "discountPercentage": 6
        },
        {
          "categoryName": "Building Sets",
          "discountPercentage": 21
        }
      ]
    }
  ],
  "company": "Relecloud",
  "city": "North Jaylan",
  "lastUpdated": {
    "$timestamp": {
      "t": 1733313006,
      "i": 1
    }
  },
  "storeOpeningDate": "2024-09-05T11:50:06.549Z"
}

示例 1:截断到当天

查询使用 $dateTrunc UTC 将时间戳截断 lastUpdated 到当天(00:00:00:00) 的开始时间。 无论时间如何,运算符都可用于按日历日期对数据进行分组或比较。

db.stores.aggregate([
  {
    $match: { _id: "e6410bb3-843d-4fa6-8c70-7472925f6d0a" }
  },
  {
    $project: {
      _id: 0,
      truncatedToDay: {
        $dateTrunc: {
          date: "$lastUpdated",
          unit: "day"
        }
      }
    }
  }
])

该示例将所有日期和时间值规范化为各自的日期的开头。

{
  "truncatedToDay": "2024-11-29T00:00:00.000Z"
}

示例 2:截断到一周开始

查询用于 $dateTrunclastUpdated 时间戳向下舍入到其周的开头。 它指定星期一作为周开始,以确保一致的日历对齐方式。

db.stores.aggregate([
  {
    $match: { _id: "e6410bb3-843d-4fa6-8c70-7472925f6d0a" }
  },
  {
    $project: {
      _id: 0,
      truncatedToWeek: {
        $dateTrunc: {
          date: "$lastUpdated",
          unit: "week",
          startOfWeek: "Monday"
        }
      }
    }
  }
])

结果显示星期一(00:00:00 UTC),用于标记可配置的一周 lastUpdated 开始。

{
  "truncatedToWeek": "2024-11-25T00:00:00.000Z"
}