I MongoDB er $dateToParts
aggregeringspipeline-operatør returnerer datodelene af en given dato.
Mere specifikt returnerer det et dokument, der indeholder de bestanddele af en given BSON Date-værdi som individuelle egenskaber.
Datodelene, der returneres af $dateToParts
er year
, month
, day
, hour
, minute
, second
og millisecond
.
Når du bruger $dateToParts
operatør, kan du eventuelt angive en tidszone, der skal bruges til resultatet.
$dateToParts
operatøren accepterer enten en dato (som enten en dato, et tidsstempel eller et objekt-id) eller et dokument, der angiver dato og tidszone, der skal bruges.
Eksempel
Antag, at vi har en samling kaldet pets
med følgende dokument:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "name" : "Fetch", "born" : ISODate("2020-12-31T23:30:15.123Z") }
Vi kan køre følgende kode for at returnere de forskellige datodele fra born
felt i det pågældende dokument.
db.pets.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
}
]
).pretty()
Resultat:
{ "dateParts" : { "year" : 2020, "month" : 12, "day" : 31, "hour" : 23, "minute" : 30, "second" : 15, "millisecond" : 123 } }
Vi kan se, at hver datodel returneres i sit eget felt.
Her brugte jeg dateParts
som feltnavnet, der skal returneres, men dette kunne have været hvad som helst (såsom theDate
etc).
_id
felt returneres som standard ved brug af projektioner i MongoDB, men i dette eksempel skjulte jeg eksplicit _id
felt ved hjælp af _id: 0
.
Angiv en tidszone
Du kan angive en tidszone, der skal bruges til output af $dateToParts
operatør.
Når du gør dette, blev argumentet sendt til $dateToParts
skal have følgende form:
{ date: <dateExpression>, timezone: <tzExpression> }
Hvor <dateExpression>
er den dato, der skal bruges, og <tzExpression>
er den tidszone, der skal bruges.
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 udsender datodelene i to forskellige tidszoner, hver ved hjælp af Olsons tidszone-id'er:
db.pets.aggregate(
[
{
$project: {
_id: 0,
honolulu: {
$dateToParts: { date: "$born", timezone: "Pacific/Honolulu" }
},
auckland: {
$dateToParts: { date: "$born", timezone: "Pacific/Auckland" }
}
}
}
]
).pretty()
Resultat:
{ "honolulu" : { "year" : 2020, "month" : 12, "day" : 31, "hour" : 13, "minute" : 30, "second" : 15, "millisecond" : 123 }, "auckland" : { "year" : 2021, "month" : 1, "day" : 1, "hour" : 12, "minute" : 30, "second" : 15, "millisecond" : 123 } }
I dette tilfælde flyttes datoen frem til næste år/måned/uge/dag/time, når du bruger Pacific/Auckland
tidszone.
UTC offset
Her er det samme eksempel, bortset fra at denne gang bruger vi UTC offset.
db.pets.aggregate(
[
{
$project: {
_id: 0,
"utcOffset-1000": {
$dateToParts: { date: "$born", timezone: "-1000" }
},
"utcOffset+1200": {
$dateToParts: { date: "$born", timezone: "+1200" }
}
}
}
]
).pretty()
Resultat:
{ "utcOffset-1000" : { "year" : 2020, "month" : 12, "day" : 31, "hour" : 13, "minute" : 30, "second" : 15, "millisecond" : 123 }, "utcOffset+1200" : { "year" : 2021, "month" : 1, "day" : 1, "hour" : 11, "minute" : 30, "second" : 15, "millisecond" : 123 } }
ISO-ugedatodele
Du kan bruge iso8601: true
for at ændre outputdokumentet til at bruge ISO-ugedatofelter. Dette baserer datoen på ISO 8601-standarden.
Antag, at vi har en samling kaldet cats
med følgende dokument:
{ "_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"), "name" : "Scratch", "born" : ISODate("2021-01-03T23:30:15.123Z") }
Vi kan køre følgende kode for at udtrække ISO-datofelterne fra born
felt i det pågældende dokument.
Her er et eksempel til demonstration:
db.pets.aggregate(
[
{
$project: {
_id: 0,
dateParts: {
$dateToParts: {
date: "$born"
}
},
datePartsISO: {
$dateToParts: {
date: "$born",
iso8601: true
}
}
}
}
]
).pretty()
Resultat:
{ "dateParts" : { "year" : 2020, "month" : 12, "day" : 31, "hour" : 23, "minute" : 30, "second" : 15, "millisecond" : 123 }, "datePartsISO" : { "isoWeekYear" : 2020, "isoWeek" : 53, "isoDayOfWeek" : 4, "hour" : 23, "minute" : 30, "second" : 15, "millisecond" : 123 } }
Det første outputdokument bruger det normale datooutput. Det andet dokument bruger ISO-ugedatofelter og -værdier.
Returner datodelene fra et objekt-id
Du kan bruge $dateToParts
for at returnere datodelene fra et ObjectId.
ObjectId-værdier er 12 byte hexadecimale værdier, der består af:
- En tidsstempelværdi på 4 byte, der repræsenterer objekt-id'ets oprettelse, målt i sekunder siden Unix-epoken.
- En 5 byte er en tilfældig værdi
- En 3 byte-tæller, initialiseret til en tilfældig værdi.
For at opsummere ser vores dokument sådan ud:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "name" : "Fetch", "born" : ISODate("2020-12-31T23:30:15.123Z") }
Dette dokument indeholder et ObjectId. Vi kan derfor bruge $dateToParts
for at returnere datodelene baseret på den dato, vores dokument blev oprettet (eller mere specifikt, når _id
feltets ObjectId-værdi blev oprettet).
Eksempel:
db.pets.aggregate(
[
{
$project:
{
"timeStamp": { $toDate: "$_id"},
"dateParts": { $dateToParts: { date: "$_id" } }
}
}
]
).pretty()
Resultat:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "timeStamp" : ISODate("2021-01-19T01:11:35Z"), "dateParts" : { "year" : 2021, "month" : 1, "day" : 19, "hour" : 1, "minute" : 11, "second" : 35, "millisecond" : 0 } }
I dette tilfælde brugte jeg også $toDate
aggregeringspipeline-operatør for at returnere tidsstempeldelen af ObjectId.