Definición
$dateFromPartsConstruye y devuelve un objeto Date dada las propiedades constitutivas de la fecha.
La expresión
$dateFromPartstiene la siguiente sintaxis:{ $dateFromParts : { 'year': <year>, 'month': <month>, 'day': <day>, 'hour': <hour>, 'minute': <minute>, 'second': <second>, 'millisecond': <ms>, 'timezone': <tzExpression> } } También puedes especificar tus campos de fecha constituyentes en fecha de semana ISO formato usando la siguiente sintaxis:
{ $dateFromParts : { 'isoWeekYear': <year>, 'isoWeek': <week>, 'isoDayOfWeek': <day>, 'hour': <hour>, 'minute': <minute>, 'second': <second>, 'millisecond': <ms>, 'timezone': <tzExpression> } } El
$dateFromPartsprocesa un documento con los siguientes campos:Importante
No puedes combinar el uso de fechas del calendario y campos de fechas semanales ISO al construir tu documento de entrada
$dateFromParts.CampoObligatorio/OpcionalDescripciónyearObligatorio si no se utiliza
isoWeekYearAño calendario. Puede ser cualquier expresión que devuelva un número.
Rango de valores:
1-9999isoWeekYearObligatorio si no se utiliza
yearAño de fecha de semana ISO. Puede ser cualquier expresión que devuelva un número.
Rango de valores:
1-9999monthopcional. Solo se puede usar con
year.Mes. Puede ser cualquier expresión que se evalúe como un número.
Se establece por defecto en
1.Rango de valores:
1-12isoWeekopcional. Solo se puede usar con
isoWeekYear.Semana del año. Puede ser cualquier expresión que se evalúe en un número.
Se establece por defecto en
1.Rango de valores:
1-53dayopcional. Solo se puede usar con
year.Día del mes. Puede ser cualquier expresión que se evalúe como un número.
Se establece por defecto en
1.Rango de valores:
1-31isoDayOfWeekopcional. Solo se puede usar con
isoWeekYear.Día de la semana (lunes
1- domingo7). Puede ser cualquier expresión que evalúe a un número.Se establece por defecto en
1.Rango de valores:
1-7hourOpcional
Hora. Puede ser cualquier expresión que se evalúe como un número.
Se establece por defecto en
0.Rango de valores:
0-23minuteOpcional
Minuto. Puede ser cualquier expresión que devuelva un número.
Se establece por defecto en
0.Rango de valores:
0-59Rango de valoressecondOpcional
Segundo. Puede ser cualquier expresión que se evalúe en un número.
Se establece por defecto en
0.Rango de valores:
0-59millisecondOpcional
Milisegundo. Puede ser cualquier expresión que devuelva un número.
Se establece por defecto en
0.Rango de valores:
0-999timezoneOpcional
<timezone>puede ser cualquier expresión que se evalúe a una string cuyo valor sea uno de los siguientes:un Identificador de zona horaria Olson, como
"Europe/London"o"America/New_York", oun desplazamiento UTC en la forma:
+/-[hh]:[mm]por ejemplo,"+04:45", o+/-[hh][mm]por ejemplo,"-0530", o+/-[hh], e.g."+03".
Para obtener más información sobre las expresiones, consulta Expresiones.
Comportamiento
Rango de valores
El rango de valores admitidos para year y isoWeekYear es 1-9999.
Si el valor especificado para campos que no sean year, isoWeekYear o timezone está fuera del rango válido, $dateFromParts lleva o resta la diferencia de otras partes de la fecha para calcular la fecha.
El valor es mayor que el rango
Considere la siguiente expresión $dateFromParts donde el valor del campo month es 14, que es 2 meses mayor que el valor máximo de 12 meses(o 1 año):
{ $dateFromParts: { 'year' : 2017, 'month' : 14, 'day': 1, 'hour' : 12 } }
La expresión calcula la fecha aumentando el year en 1 y estableciendo el month en 2 para devolver:
ISODate("2018-02-01T12:00:00Z")
El valor es menor que el rango
Considera la siguiente $dateFromParts expresión donde el valor del campo month es 0, lo que equivale a 1 mes menos que el valor mínimo de 1 mes:
{ $dateFromParts: { 'year' : 2017, 'month' : 0, 'day': 1, 'hour' : 12 } }
La expresión calcula la fecha disminuyendo el year en 1 y ajustando el month a 12 para devolver:
ISODate("2016-12-01T12:00:00Z")
Zona horaria
Cuando use un identificador de zona horaria Olson en el campo <timezone>, MongoDB aplica el ajuste de DST si corresponde para la zona horaria especificada.
Por ejemplo, considera una colección sales con el siguiente documento:
db.sales.insertOne( { "_id" : 1, "item" : "abc", "price" : 10, "quantity" : 2, "date" : ISODate("2014-01-01T08:15:39.736Z") } )
La siguiente agregación ilustra cómo MongoDB gestiona el ajuste de DST para el identificador de zona horaria Olson. El ejemplo usa los operadores $hour y $minute para devolver las partes correspondientes del campo date:
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" } } } }])
La operación devuelve el siguiente resultado:
{ "_id": 1, "nycHour" : 5, "nycMinute" : 24, "gmtHour" : 10, "gmtMinute" : 24, "nycOlsonHour" : 6, "nycOlsonMinute" : 24 }
Ejemplo
La siguiente agregación usa $dateFromParts para construir tres objetos de fecha a partir de los campos de entrada proporcionados:
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' } } } }])
La operación devuelve el siguiente resultado:
{ "_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") }