从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