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