$dateFromParts (aggregation)
On this page本页内容
Definition定义
$dateFromParts
-
Constructs and returns a Date object given the date's constituent properties.构造并返回日期对象,给定日期的组成属性。The$dateFromParts
expression has the following syntax:$dateFromParts
表达式具有以下语法:{
$dateFromParts : {
'year': <year>, 'month': <month>, 'day': <day>,
'hour': <hour>, 'minute': <minute>, 'second': <second>,
'millisecond': <ms>, 'timezone': <tzExpression>
}
}You can also specify your constituent date fields in ISO week date您还可以使用以下语法以ISO week dateformat using the following syntax:
格式指定组成日期字段:
{
$dateFromParts : {
'isoWeekYear': <year>, 'isoWeek': <week>, 'isoDayOfWeek': <day>,
'hour': <hour>, 'minute': <minute>, 'second': <second>,
'millisecond': <ms>, 'timezone': <tzExpression>
}
}The$dateFromParts
takes a document with the following fields:$dateFromParts
获取具有以下字段的文档:ImportantYou cannot combine the use of calendar dates and ISO week date fields when constructing your在构造$dateFromParts
input document.$dateFromParts
输入文档时,不能同时使用日历日期和ISO周日期字段。Field字段Required/Optional必需/可选Description描述year
Required if not using如果不使用isoWeekYear
isoWeekYear
,则需要Calendar year.日历年。Can be any expression that evaluates to a number.可以是任何计算结果为数字的表达式。
Value range:值范围:1
-9999
If the number specified is outside this range,$dateFromParts
errors.1
-999
9如果指定的数字超出此范围,则$dateFromParts
错误。Starting in MongoDB 4.4, the lower bound for this value is从MongoDB 4.4开始,这个值的下限是1
.1
。In previous versions of MongoDB, the lower bound was在MongoDB的早期版本中,下限为0
.0
。isoWeekYear
Required if not using如果不使用year
year
,则需要ISO Week Date Year.ISO周日期年份。Can be any expression that evaluates to a number.可以是任何计算结果为数字的表达式。
Value range:值范围:1
-9999
If the number specified is outside this range,$dateFromParts
errors. Starting in MongoDB 4.4, the lower bound for this value is1
.1
-9999
如果指定的数字超出此范围,则$dateFromParts
错误。从MongoDB 4.4开始,这个值的下限是1。In previous versions of MongoDB, the lower bound was在MongoDB的早期版本中,下限为0
.0
。month
Optional.可选的。Can only be used with只能与year
.year
一起使用。Month.月Can be any expression that evaluates to a number.可以是任何计算结果为数字的表达式。
Defaults to默认值为1
.1
。
Value range:值范围:1
-12
If the number specified is outside this range,$dateFromParts
incorporates the difference in the date calculation.1
-12
如果指定的数字在此范围之外,$dateFromParts
会在日期计算中包含差异。See Value Range for examples.有关示例,请参阅值范围。isoWeek
Optional.可选的。Can only be used with只能与isoWeekYear
.isoWeekYear
一起使用。Week of year.一年中的一周。Can be any expression that evaluates to a number.可以是任何计算结果为数字的表达式。
Defaults to默认值为1
.1
。
Value range:值范围:1
-53
If the number specified is outside this range,$dateFromParts
incorporates the difference in the date calculation.1
-53
如果指定的数字在此范围之外,$dateFromParts
会在日期计算中包含差异。See Value Range for examples.有关示例,请参阅值范围。day
Optional.可选的。Can only be used with只能与year
.year
一起使用。Day of month.一个月的哪一天。Can be any expression that evaluates to a number.可以是任何计算结果为数字的表达式。
Defaults to默认值为1
.1
。
Value range:值范围:1
-31
If the number specified is outside this range,$dateFromParts
incorporates the difference in the date calculation.1
-31
。如果指定的数字在此范围之外,$dateFromParts
会在日期计算中包含差异。See Value Range for examples.有关示例,请参阅值范围。isoDayOfWeek
Optional.可选的。Can only be used with只能与isoWeekYear
.isoWeekYear
一起使用Day of week (Monday星期一(星期一1
- Sunday7
).1
至星期日7
)。Can be any expression that evaluates to a number.可以是任何计算结果为数字的表达式。
Defaults to默认值为1
.1
。
Value range:值范围:1
-7
If the number specified is outside this range,$dateFromParts
incorporates the difference in the date calculation.1
-7
如果指定的数字在此范围之外,$dateFromParts
会在日期计算中包含差异。See Value Range for examples.有关示例,请参阅值范围。hour
Optional可选的Hour.小时Can be any expression that evaluates to a number.可以是任何计算结果为数字的表达式。
Defaults to默认值为0
.0
。
Value range:值范围:0
-23
If the number specified is outside this range,$dateFromParts
incorporates the difference in the date calculation.0
-23
。如果指定的数字在此范围之外,$dateFromParts
会在日期计算中包含差异。See Value Range for examples.有关示例,请参阅值范围。minute
Optional可选的Minute.分钟。Can be any expression that evaluates to a number.可以是任何计算结果为数字的表达式。
Defaults to默认值为0
.0
。
Value range:值范围:0
-59
If the number specified is outside this range,$dateFromParts
incorporates the difference in the date calculation.0
-59
。如果指定的数字在此范围之外,$dateFromParts
会在日期计算中包含差异。See Value Range for examples.有关示例,请参阅值范围。second
Optional可选的Second.秒。Can be any expression that evaluates to a number.可以是任何计算结果为数字的表达式。
Defaults to默认值为0
.0
。
Value range:值范围:0
-59
If the number specified is outside this range,$dateFromParts
incorporates the difference in the date calculation.0
-59
。如果指定的数字在此范围之外,$dateFromParts
会在日期计算中包含差异。See Value Range for examples.有关示例,请参阅值范围。millisecond
Optional可选的Millisecond.毫秒。Can be any expression that evaluates to a number.可以是任何计算结果为数字的表达式。
Defaults to默认值为0
.0
。
Value range:值范围:0
-999
If the number specified is outside this range,$dateFromParts
incorporates the difference in the date calculation.0
-999
。如果指定的数字在此范围之外,$dateFromParts
会在日期计算中包含差异。See Value Range for examples.有关示例,请参阅值范围。timezone
Optional可选的<timezone>
can be any expression that evaluates to a string whose value is either:<timezone>
可以是任何计算结果为字符串的表达式,该字符串的值为:an Olson Timezone Identifier奥尔森时区标识符, such as
"Europe/London"
or"America/New_York"
, or,如
"Europe/London"
或"America/New_York"
,或a UTC offset in the form:UTC偏移量,格式为:+/-[hh]:[mm]
, e.g."+04:45"
, or+/-[hh][mm]
, e.g."-0530"
, or+/-[hh]
, e.g."+03"
.
For more information on expressions, see Expressions.有关表达式的详细信息,请参阅表达式。
Behavior行为
Value Range数值范围
Starting in MongoDB 4.4, the supported value range for 从MongoDB 4.4开始,year
and isoWeekYear
is 1-9999
. year
和isoWeekYear
支持的值范围是1
-999
。In prior versions of MongoDB, the lower bound for these values was 在MongoDB的早期版本中,这些值的下限为0
and the supported value range was 0-9999
.0
,支持的值范围为0
-9999
。
If the value specified for fields other than 如果为year
, isoWeekYear
, and timezone
is outside the valid range, $dateFromParts
carries or subtracts the difference from other date parts to calculate the date.year
、isoWeekYear
和timezone
以外的字段指定的值超出有效范围,$dateFromParts
将携带或减去其他日期部分的差值来计算日期。
Value is Greater than the Range值大于范围
Consider the following 考虑以下$dateFromParts
expression where the month
field value is 14
, which is 2 months greater than the maximum value of 12 months(or 1 year):$dateFromParts
表达式,其中month
字段值为14
,比12个月(或1年)的最大值大2个月:
{ $dateFromParts: { 'year' : 2017, 'month' : 14, 'day': 1, 'hour' : 12 } }
The expression calculates the date by increasing the 该表达式通过将year
by 1 and setting the month
to 2 to return:year
增加1并将month
设置为2来计算日期:
ISODate("2018-02-01T12:00:00Z")
Value is Less than the Range值小于范围
Consider the following 考虑以下$dateFromParts
expression where the month
field value is 0
, which is 1 month less than the minimum value of 1 month:$dateFromParts
表达式,其中month
字段值为0
,比1个月的最小值小1个月:
{ $dateFromParts: { 'year' : 2017, 'month' : 0, 'day': 1, 'hour' : 12 } }
The expression calculates the date by decreasing the 该表达式通过将year
by 1 and setting the month
to 12 to return:year
减少1并将month
设置为12来计算日期:
ISODate("2016-12-01T12:00:00Z")
Time Zone时区
When using an Olson Timezone Identifier in the 当在<timezone>
field, MongoDB applies the DST offset if applicable for the specified timezone.<timezone>
字段中使用Olson时区标识符时,MongoDB会应用DST
偏移量(如果适用于指定时区)。
For example, consider a 例如,考虑具有以下文档的sales
collection with the following document:sales
集合:
{
"_id" : 1,
"item" : "abc",
"price" : 20,
"quantity" : 5,
"date" : ISODate("2017-05-20T10:24:51.303Z")
}
The following aggregation illustrates how MongoDB handles the DST offset for the Olson Timezone Identifier. 下面的聚合说明了MongoDB如何处理Olson时区标识符的DST偏移量。The example uses the 该示例使用$hour
and $minute
operators to return the corresponding portions of the date
field:$hour
和$minute
运算符返回日期字段的相应部分:
db.sales.aggregate([
{
$project: {
"nycHour": {
$hour: { date: "$date", timezone: "-05:00" }
},
"nycMinute": {
$minute: { date: "$date", timezone: "-05:00" }
},
"gmtHour": {
$hour: { date: "$date", timezone: "GMT" }
},
"gmtMinute": {
$minute: { date: "$date", timezone: "GMT" } },
"nycOlsonHour": {
$hour: { date: "$date", timezone: "America/New_York" }
},
"nycOlsonMinute": {
$minute: { date: "$date", timezone: "America/New_York" }
}
}
}])
The operation returns the following result:该操作返回以下结果:
{
"_id": 1,
"nycHour" : 5,
"nycMinute" : 24,
"gmtHour" : 10,
"gmtMinute" : 24,
"nycOlsonHour" : 6,
"nycOlsonMinute" : 24
}
Example实例
The following aggregation uses 以下聚合使用$dateFromParts
to construct three date objects from the provided input fields:$dateFromParts
从提供的输入字段构造三个日期对象:
db.sales.aggregate([
{
$project: {
date: {
$dateFromParts: {
'year' : 2017, 'month' : 2, 'day': 8, 'hour' : 12
}
},
date_iso: {
$dateFromParts: {
'isoWeekYear' : 2017, 'isoWeek' : 6, 'isoDayOfWeek' : 3, 'hour' : 12
}
},
date_timezone: {
$dateFromParts: {
'year' : 2016, 'month' : 12, 'day' : 31, 'hour' : 23,
'minute' : 46, 'second' : 12, 'timezone' : 'America/New_York'
}
}
}
}])
The operation returns the following result:该操作返回以下结果:
{
"_id" : 1,
"date" : ISODate("2017-02-08T12:00:00Z"),
"date_iso" : ISODate("2017-02-08T12:00:00Z"),
"date_timezone" : ISODate("2017-01-01T04:46:12Z")
}