I MongoDB er $dateFromParts
aggregeringspipeline-operatør konstruerer og returnerer et Date-objekt fra datoens bestanddele.
Du angiver hver datodel som et separat felt.
Du kan angive dine konstituerende datofelter i ISO-ugedatoformat, hvis det kræves.
Eksempel
Antag, at vi har en samling kaldet dateParts
med følgende dokument:
{ "_id" : 1, "year" : 2020, "month" : 12, "day" : 31, "hour" : 23, "minute" : 30, "second" : 25, "millisecond" : 123 }
Dokumentet indeholder et andet felt for hver datodel.
Vi kan køre følgende kode for at returnere et datoobjekt fra felterne i disse dokumenter.
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") }
Alle dato/tidsdele er blevet konverteret til et enkelt datoobjekt.
Tidszoner
Du kan bruge timezone
felt for at angive en tidszone.
Tidszonen kan angives ved hjælp af enten Olsons tidszone-id (f.eks. "Europe/London"
, "GMT"
) eller UTC offset (f.eks. "+02:30"
, "-1030"
).
Olson Timezone Identifier
Her er et eksempel, der bruger Olson-tidszone-id'er til at udlæse tre forskellige datoer fra et enkelt dokument, baseret på tre forskellige 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
Her er et eksempel, der bruger 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-ugedatoformat
Datodelene kan specificeres ved brug af ISO 8601-formatet, hvis det kræves.
Du kan især bruge:
Formatspecifikation | Output |
---|---|
isoWeekYear | Årtal i ISO 8601-format. Dette felt er påkrævet, hvis du ikke bruger year (og year er påkrævet, hvis du ikke bruger isoWeekYear ). |
isoWeek | Årets uge i ISO 8601-format. Kan kun bruges med isoWeekYear . |
isoDayOfWeek | Ugedag (1-mandag, 7-søndag). Kan kun bruges med isoWeekYear . |
Antag, at vi indsætter et andet dokument, der ser sådan ud:
{ "_id" : 2, "isoWeekYear" : 2021, "isoWeek" : 32, "isoDayOfWeek" : 7, "hour" : 23, "minute" : 30, "second" : 25, "millisecond" : 123, "timezone" : "UTC" }
Vi kan se, at den bruger isoWeekYear
, isoWeek
og isoDayOfWeek
i stedet for year
, month
og day
(hvilket er hvad det første dokument bruger).
Vi kan bruge følgende kode til at konstruere et Date-objekt ud fra dette 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") }
Felter uden for rækkevidde
Starter i MongoDB 4.4, det understøttede værdiinterval for year
og isoWeekYear
er 1-9999
. I tidligere versioner var den nedre grænse for disse værdier 0
og det understøttede værdiinterval var 0-9999
.
Starter i MongoDB 4.0, hvis værdien er angivet for andre felter end year
, isoWeekYear
og timezone
er uden for det gyldige interval, $dateFromParts
operatør bærer eller trækker forskellen fra andre datodele for at beregne datoen.
Værdier højere end området
Antag, at vi tilføjer følgende dokument til vores samling:
{ "_id" : 3, "year" : 2020, "month" : 14, "day" : 65, "hour" : 48, "minute" : 130, "second" : 625, "millisecond" : 123 }
Mange af dato- og tidsfelterne i dette dokument er højere end deres respektive gyldige intervaller.
Lad os køre følgende kommando for at konvertere det til et Dato-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, at datodelene i det resulterende Date-objekt er forskellige fra deres respektive datodele i dokumentet. Dette er fordi $dateFromParts
genberegnet datoen for at tage højde for de datodelværdier, der overskred deres normale interval.
Værdier lavere end området
Antag, at vi tilføjer følgende dokument til vores samling:
{ "_id" : 4, "year" : 2020, "month" : 0, "day" : 0, "hour" : 0, "minute" : 0, "second" : 0, "millisecond" : 0 }
Mange af dato- og tidsfelterne i dette dokument er lavere end deres respektive gyldige intervaller.
Lad os køre følgende kommando for at konvertere det til et Dato-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") }