I MongoDB, $dateFromParts
aggregeringspipeline-operatör konstruerar och returnerar ett Date-objekt från datumets beståndsdelar.
Du anger varje datumdel som ett separat fält.
Du kan ange dina ingående datumfält i ISO-veckodatumformat om det behövs.
Exempel
Anta att vi har en samling som heter dateParts
med följande dokument:
{ "_id" : 1, "year" : 2020, "month" : 12, "day" : 31, "hour" : 23, "minute" : 30, "second" : 25, "millisecond" : 123 }
Dokumentet innehåller olika fält för varje datumdel.
Vi kan köra följande kod för att returnera ett datumobjekt från fälten i dessa dokument.
db.dateParts.aggregate([
{
$project: {
date: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond"
}
}
}
}])
Resultat:
{ "_id" : 1, "date" : ISODate("2020-12-31T23:30:25.123Z") }
Alla datum/tidsdelar har konverterats till ett enda datumobjekt.
Tidszoner
Du kan använda timezone
fältet för att ange en tidszon.
Tidszonen kan specificeras med antingen Olsons tidszonsidentifierare (t.ex. "Europe/London"
, "GMT"
) eller UTC-offset (t.ex. "+02:30"
, "-1030"
).
Olsons tidszonsidentifierare
Här är ett exempel som använder Olsons tidszons-ID för att mata ut tre olika datum från ett enda dokument, baserat på tre olika tidszoner.
db.dateParts.aggregate([
{
$project: {
dateUTC: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "Pacific/Auckland"
}
},
dateHonolulu: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "Pacific/Honolulu"
}
},
dateAuckland: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "Pacific/Auckland"
}
}
}
}]).pretty()
Resultat:
{ "_id" : 1, "dateUTC" : ISODate("2020-12-31T10:30:25.123Z"), "dateHonolulu" : ISODate("2021-01-01T09:30:25.123Z"), "dateAuckland" : ISODate("2020-12-31T10:30:25.123Z") }
UTC-offset
Här är ett exempel som använder UTC-offset.
db.dateParts.aggregate([
{
$project: {
"date+00:00": {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "+00:00"
}
},
"date-10:00": {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "-10:00"
}
},
"date+12:00": {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "+12:00"
}
}
}
}]).pretty()
Resultat:
{ "_id" : 1, "date+00:00" : ISODate("2020-12-31T23:30:25.123Z"), "date-10:00" : ISODate("2021-01-01T09:30:25.123Z"), "date+12:00" : ISODate("2020-12-31T11:30:25.123Z") }
ISO-veckodatumformat
Datumdelarna kan specificeras med ISO 8601-formatet vid behov.
I synnerhet kan du använda:
Formatspecifikation | Utdata |
---|---|
isoWeekYear | Årtal i ISO 8601-format. Detta fält är obligatoriskt om du inte använder year (och year krävs om du inte använder isoWeekYear ). |
isoWeek | Årets vecka i ISO 8601-format. Kan endast användas med isoWeekYear . |
isoDayOfWeek | Veckodag (1-måndag, 7-söndag). Kan endast användas med isoWeekYear . |
Anta att vi infogar ett andra dokument som ser ut så här:
{ "_id" : 2, "isoWeekYear" : 2021, "isoWeek" : 32, "isoDayOfWeek" : 7, "hour" : 23, "minute" : 30, "second" : 25, "millisecond" : 123, "timezone" : "UTC" }
Vi kan se att den använder isoWeekYear
, isoWeek
och isoDayOfWeek
istället för year
, month
och day
(vilket är vad det första dokumentet använder).
Vi kan använda följande kod för att konstruera ett Date-objekt från detta dokument:
db.dateParts.aggregate([
{ $match: { _id: 2} },
{
$project: {
date: {
$dateFromParts: {
"isoWeekYear": "$isoWeekYear",
"isoWeek": "$isoWeek",
"isoDayOfWeek": "$isoDayOfWeek",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "$timezone"
}
}
}
}
])
Resultat:
{ "_id" : 2, "date" : ISODate("2021-08-15T23:30:25.123Z") }
Fält utanför intervallet
Från och med MongoDB 4.4, det värdeintervall som stöds för year
och isoWeekYear
är 1-9999
. I tidigare versioner var den nedre gränsen för dessa värden 0
och det värdeintervall som stöds var 0-9999
.
Från och med MongoDB 4.0, om värdet anges för andra fält än year
, isoWeekYear
och timezone
är utanför det giltiga intervallet, $dateFromParts
operatören bär eller subtraherar skillnaden från andra datumdelar för att beräkna datumet.
Värden högre än intervallet
Anta att vi lägger till följande dokument i vår samling:
{ "_id" : 3, "year" : 2020, "month" : 14, "day" : 65, "hour" : 48, "minute" : 130, "second" : 625, "millisecond" : 123 }
Många av datum- och tidsfälten i detta dokument är högre än deras respektive giltiga intervall.
Låt oss köra följande kommando för att konvertera det till ett Date-objekt:
db.dateParts.aggregate([
{ $match: { _id: 3} },
{
$project: {
date: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond"
}
}
}
}
])
Resultat:
{ "_id" : 3, "date" : ISODate("2021-04-08T02:20:25.123Z") }
Vi kan se att datumdelarna i det resulterande Date-objektet skiljer sig från deras respektive datumdelar i dokumentet. Detta beror på att $dateFromParts
räknade om datumet för att ta hänsyn till datumdelvärdena som överskred deras normala intervall.
Värden lägre än intervallet
Anta att vi lägger till följande dokument i vår samling:
{ "_id" : 4, "year" : 2020, "month" : 0, "day" : 0, "hour" : 0, "minute" : 0, "second" : 0, "millisecond" : 0 }
Många av datum- och tidsfälten i detta dokument är lägre än deras respektive giltiga intervall.
Låt oss köra följande kommando för att konvertera det till ett Date-objekt:
db.dateParts.aggregate([
{ $match: { _id: 4} },
{
$project: {
date: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond"
}
}
}
}
])
Resultat:
{ "_id" : 4, "date" : ISODate("2019-11-30T00:00:00Z") }