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") }