从MongoDB中的日期获取年份的6种方法

发布于

MongoDB提供了相当多的聚合管道运算符来处理日期。这包括提取日期某些部分(如年、月、日等)的运算符。

还有一些MongoDB方法可以让你遍历游标,并应用JavaScript函数。因此,这允许您使用 JavaScript 从字段中提取日期值和日期部分等。

本文介绍了从MongoDB中的日期返回年份部分的6种方法。

示例数据

假设我们有一个包含以下文档的集合:cats

{ “_id” : 1, “name” : “Scratch”, “born” : ISODate(“2021-01-03T23:30:15.123Z”) } { “_id” : 2, “name” : “Meow”, “born” : ISODate(“2019-12-08T04:00:12Z”) } { “_id” : 3, “name” : “Fluffy”, “born” : ISODate(“2020-09-24T10:30:00Z”) }

以下示例演示了从这些文档的字段返回年份部分的各种选项。born

运营商$year

运算符是从日期中提取年份部分的最明显选择。它专门设计用于返回包含日期的年份部分的文档。[$year](https://database.guide/mongodb-year/ "MongoDB $year")

我们可以运行以下代码从上述文档中的字段中返回年份。born

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthYear: { $year: "$born" }
        }
    }
  ]
)

结果:

{ “birthYear” : 2021 } { “birthYear” : 2019 } { “birthYear” : 2020 }

您还可以在使用运算符时指定时区。$year

请参阅 MongoDB $year 了解更多信息和示例。

运营商$dateToString

运算符根据用户指定的格式将日期对象转换为字符串。因此,如果需要,用户可以指定仅返回年份部分。[$dateToString](https://database.guide/mongodb-datetostring/ "MongoDB $dateToString")

每个日期部分都有格式说明符。格式说明符返回年份。%Y

例:

db.cats.aggregate(
   [
     {
       $project: {
         _id: 0,
          birthYear: { $dateToString: { format: "%Y", date: "$born" } }
       }
     }
   ]
)

结果:

{ “birthYear” : “2021” } { “birthYear” : “2019” } { “birthYear” : “2020” }

我们本可以提供更多的格式说明符来在结果中包含日期部分,但由于我们只对本文中提取年份感兴趣,因此我们只使用了一个格式说明符。

请参阅 MongoDB $dateToString 了解更多信息和示例。

运营商$dateToParts

运算符返回一个文档,其中包含给定 BSON Date 值的组成部分作为单个属性。返回的属性为 、、、、 和 。[$dateToParts](https://database.guide/mongodb-datetoparts/ "MongoDB $dateToParts")``year``month``day``hour``minute``second``millisecond

有了这些知识,我们可以在一个流水线阶段中使用,然后添加另一个流水线阶段来提取零件。$dateToParts``year

以下是我们三个文档的回报:$dateToParts

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          dateParts: { $dateToParts: { date: "$born" } }
        }
    }
  ]
).pretty()

结果:

{ “dateParts” : { “year” : 2021, “month” : 1, “day” : 3, “hour” : 23, “minute” : 30, “second” : 15, “millisecond” : 123 } } { “dateParts” : { “year” : 2019, “month” : 12, “day” : 8, “hour” : 4, “minute” : 0, “second” : 12, “millisecond” : 0 } } { “dateParts” : { “year” : 2020, “month” : 9, “day” : 24, “hour” : 10, “minute” : 30, “second” : 0, “millisecond” : 0 } }

可以将此数据传递到管道中的下一阶段,以仅提取字段。year

如果我们只为字段添加另一个投影,会发生什么情况:year

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          dateParts: { $dateToParts: { date: "$born" } }
        }
    },
    {
      $project:
        {
          birthYear: "$dateParts.year"
        }
    }
  ]
)

结果:

{ “birthYear” : 2021 } { “birthYear” : 2019 } { “birthYear” : 2020 }

这显然不如使用前面的选项简洁。但是,根据你在管道中执行的操作,此方法可能是一个方便的选项。

运算符还接受一个参数,该参数修改输出文档以使用 ISO 周日期字段。$dateToParts``iso8601

请参阅 MongoDB $dateToParts 了解更多信息和示例。

方法forEach()

您可以使用 JavaScript 方法(如 或)循环访问游标,以便仅返回年份值。[cursor.forEach()](https://database.guide/mongodb-foreach/ "MongoDB forEach()")``getFullYear()``getUTCFullYear()

db.cats.find().forEach(
  function(c) {
    print(
      c.born.getFullYear()
      );
  }
);

结果:

2021 2019 2020

前面的选项返回包含名称/值对的整个文档。此选项仅返回实际年份值,而不是整个文档。

方法map()

该方法将函数应用于游标访问的每个文档,并将值合并到一个数组中。[cursor.map()](https://database.guide/mongodb-map/ "MongoDB map()")

例:

db.cats.find().map(
  function(c) {
    c = c.born.getFullYear();
    return c;
  }
);

结果:

[ 2021, 2019, 2020 ]

运营商$isoWeekYear

如果需要以 ISO 8601 格式返回年份,请使用 。ISO 8601 年从第 1 周的星期一开始,到最后一周的星期日结束。[$isoWeekYear](https://database.guide/mongodb-isoweekyear/ "MongoDB $isoWeekYear")

例:

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthIsoWeekYear: { $isoWeekYear: "$born" }
        }
    }
  ]
)

结果:

{ “birthIsoWeekYear” : NumberLong(2020) } { “birthIsoWeekYear” : NumberLong(2019) } { “birthIsoWeekYear” : NumberLong(2020) }

请注意,第一年现在是 2020 年,而不是前面示例中的 2021 年。并非所有年份在使用时都会有所不同,因为它取决于所讨论的日期。$isoWeekYear