I MongoDB, $dateToString
aggregeringspipeline-operatör konverterar ett givet datumobjekt till en sträng.
$dateToString
operatören accepterar antingen ett datum, en tidsstämpel eller ett objekt-ID.
Du kan ange ett format som ska användas för resultatet genom att tillhandahålla en formatspecifikation. Formatspecifikationen kan vara vilken sträng som helst och innehålla 0 eller fler formatspecifikationer.
Formatspecifikationen är valfri från MongoDB version 4.0, när featureCompatibilityVersion
är inställd på 4.0
eller högre. Tidigare versioner kräver formatspecifikationen.
Du kan valfritt använda timezone
parameter för att ange den tidszon som ska användas.
Du kan också använda onNull
parameter för att ange vad som ska returneras om datumet är null
eller saknas.
Exempel
Anta att vi har en samling som heter pets
med följande dokument:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "name" : "Fetch", "born" : ISODate("2020-12-31T23:30:15.123Z") }
Vi kan köra följande kod för att returnera en datumsträng från born
fältet i det dokumentet.
db.pets.aggregate(
[
{
$project: {
_id: 0,
dateString: { $dateToString: { format: "%Y-%m-%dT%H:%M:%S.%LZ", date: "$born" } }
}
}
]
)
Resultat:
{ "dateString" : "2020-12-31T23:30:15.123Z" }
Det här exemplet använder %Y-%m-%dT%H:%M:%S.%LZ
som formatspecifikation. Detta råkar vara standardformatspecifikationen, men i det här fallet angav vi det uttryckligen. Vi kan se att datumsträngen returneras med det angivna formatet.
Här använde jag dateString
som fältnamnet att returnera, men detta kan ha varit vad som helst (som formattedDate
, theDate
etc).
_id
fältet returneras som standard när man använder projektioner i MongoDB, men i det här exemplet gömde jag uttryckligen _id
fält med _id: 0
.
Se MongoDB $dateToString
Formatspecifikationer för en lista över tillgängliga formatspecifikationer.
Standardutgång
Som nämnts är formatspecifikationen i föregående exempel standardformatspecifikationen.
Om du använder MongoDB version 4.0 eller senare, med featureCompatibilityVersion
inställd på 4.0
eller högre (se hur du visar din nuvarande featureCompatibilityVersion
och hur man ställer in det), kan du utelämna formatspecifikationen om du vill att datumet ska formateras med formatet ovan.
Därför kunde vi skriva om det föregående. exempel på detta:
db.pets.aggregate(
[
{
$project: {
_id: 0,
dateString: { $dateToString: { date: "$born" } }
}
}
]
)
Resultat:
{ "dateString" : "2020-12-31T23:30:15.123Z" }
Ange en tidszon
Du kan ange en tidszon som ska användas för utmatningen av $dateToString
operatör.
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 matar ut datumsträngen i tre olika tidszoner, var och en med Olsons tidszons-ID:
db.pets.aggregate(
[
{
$project: {
_id: 0,
UTC: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "UTC" } },
Honolulu: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "Pacific/Honolulu" } },
Auckland: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "Pacific/Auckland" } }
}
}
]
).pretty()
Resultat:
{ "UTC" : "2020-12-31T23:30", "Honolulu" : "2020-12-31T13:30", "Auckland" : "2021-01-01T12:30" }
UTC-offset
Här är ett exempel som använder UTC-offset.
db.pets.aggregate(
[
{
$project: {
_id: 0,
UTC: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "+00:00" } },
Honolulu: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "-10:00" } },
Auckland: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "+12:00" } }
}
}
]
).pretty()
Resultat:
{ "UTC" : "2020-12-31T23:30", "Honolulu" : "2020-12-31T13:30", "Auckland" : "2021-01-01T11:30" }
ISO-veckodatumformat
Det finns några formatspecifikationer som gör att du kan mata ut datumsträngen med ISO 8601-formatet.
I synnerhet kan du använda:
Formatspecifikation | Utdata |
---|---|
%G | Årtal i ISO 8601-format |
%u | Veckodagnummer i ISO 8601-format (1-måndag, 7-söndag) |
%V | Årets vecka i ISO 8601-format |
Anta att vi har en samling som heter cats
med följande dokument:
{ "_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"), "name" : "Scratch", "born" : ISODate("2021-01-03T23:30:15.123Z") }
Vi kan köra följande kod för att extrahera ISO-datumfälten från born
fältet i det dokumentet.
Här är ett exempel att visa:
db.cats.aggregate(
[
{
$project: {
_id: 0,
isoYear: { $dateToString: { format: "%G", date: "$born" } },
isoDayOfWeek: { $dateToString: { format: "%u", date: "$born" } },
isoWeekOfYear: { $dateToString: { format: "%V", date: "$born" } }
}
}
]
)
Resultat:
{ "isoYear" : "2020", "isoDayOfWeek" : "7", "isoWeekOfYear" : "53" }
Däremot nedan är samma exempel, men med veckodatum som inte är ISO.
db.cats.aggregate(
[
{
$project: {
_id: 0,
year: { $dateToString: { format: "%Y", date: "$born" } },
dayofweek: { $dateToString: { format: "%w", date: "$born" } },
weekofyear: { $dateToString: { format: "%U", date: "$born" } }
}
}
]
)
Resultat:
{ "year" : "2021", "dayofweek" : "1", "weekofyear" : "01" }
Vi kan se att resultatet är ett helt annat.
onNull
Parameter
onNull
parameter kan användas för att ange vad som ska returneras om datumet är null eller inte existerar.
Värdet som tillhandahålls till onNull
parameter kan vara vilket giltigt uttryck som helst.
Här är ett exempel:
db.pets.aggregate(
[
{
$project: {
_id: 0,
dateString: { $dateToString: { date: null, onNull: "No date supplied" } }
}
}
]
)
Resultat:
{ "dateString" : "No date supplied" }
I det här fallet var datumet null
och så inkluderar utdatadokumentet strängen som jag angav för onNull
parameter.
Returnera datumdelarna från ett objekt-ID
Du kan använda $dateToString
för att returnera en datumsträng från ett ObjectId.
ObjectId-värden är hexadecimala värden på 12 byte som består av:
- Ett tidsstämpelvärde på 4 byte, som representerar objekt-ID:ts skapelse, mätt i sekunder sedan Unix-epoken.
- En 5 byte är ett slumpmässigt värde
- En 3-byte inkrementerande räknare, initierad till ett slumpmässigt värde.
För att sammanfatta ser vårt första dokument ut så här:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "name" : "Fetch", "born" : ISODate("2020-12-31T23:30:15.123Z") }
Detta dokument innehåller ett ObjectId. Vi kan därför använda $dateToString
för att returnera en datumsträng, baserat på det datum då vårt dokument skapades (eller mer specifikt, när _id
fältets ObjectId-värde skapades).
Exempel:
db.pets.aggregate(
[
{
$project: {
timestamp: { $toDate: "$_id" },
dateString: { $dateToString: { format: "%d-%m-%Y", date: "$_id" } }
}
}
]
).pretty()
Resultat:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "timestamp" : ISODate("2021-01-19T01:11:35Z"), "dateString" : "19-01-2021" }
I det här fallet bestämde jag mig för att bara returnera datumdelen (inte tidsdelen). Jag ändrade också ordningen på dagar, månader och år för att visa att du säkert kan göra detta om det behövs.
Jag använde också $toDate
aggregeringspipeline-operatör för att returnera tidsstämpeldelen av ObjectId.