I MongoDB er $dateToString
aggregeringspipeline-operator konverterer et givet datoobjekt til en streng.
$dateToString
operatøren accepterer enten en dato, et tidsstempel eller et objekt-id.
Du kan angive et format, der skal bruges til resultatet, ved at angive en formatspecifikation. Formatspecifikationen kan være en hvilken som helst streng literal, indeholdende 0 eller flere formatspecifikationer.
Formatspecifikationen er valgfri fra MongoDB version 4.0, når featureCompatibilityVersion
er indstillet til 4.0
eller højere. Tidligere versioner kræver formatspecifikationen.
Du kan valgfrit bruge timezone
parameter for at angive den tidszone, der skal bruges.
Du kan også bruge onNull
parameter for at angive, hvad der skal returneres, hvis datoen er null
eller mangler.
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 en datostreng fra born
felt i det pågældende dokument.
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" }
Dette eksempel bruger %Y-%m-%dT%H:%M:%S.%LZ
som formatspecifikation. Dette er tilfældigvis standardformatspecifikationen, men i dette tilfælde specificerede vi det eksplicit. Vi kan se, at datostrengen returneres i det angivne format.
Her brugte jeg dateString
som feltnavnet, der skal returneres, men dette kunne have været hvad som helst (såsom formattedDate
, 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
.
Se MongoDB $dateToString
Formatspecifikationer for en liste over tilgængelige formatspecifikationer.
Standardoutput
Som nævnt er formatspecifikationen i det foregående eksempel standardformatspecifikationen.
Hvis du bruger MongoDB version 4.0 eller nyere, med featureCompatibilityVersion
indstillet til 4.0
eller højere (se, hvordan du får vist din nuværende featureCompatibilityVersion
og hvordan du indstiller det), kan du udelade formatspecifikationen, hvis du ønsker, at datoen skal formateres med ovenstående format.
Derfor kunne vi omskrive det forrige. eksempel på dette:
db.pets.aggregate(
[
{
$project: {
_id: 0,
dateString: { $dateToString: { date: "$born" } }
}
}
]
)
Resultat:
{ "dateString" : "2020-12-31T23:30:15.123Z" }
Angiv en tidszone
Du kan angive en tidszone, der skal bruges til output af $dateToString
operatør.
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 datostrengen i tre forskellige tidszoner, hver ved hjælp af Olsons tidszone-id'er:
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
Her er et eksempel, der bruger 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-ugedatoformat
Der er et par formatspecifikationer, der gør det muligt for dig at udskrive datostrengen ved hjælp af ISO 8601-formatet.
Du kan især bruge:
Formatspecifikation | Output |
---|---|
%G | Årtal i ISO 8601-format |
%u | Ugedagnummer i ISO 8601-format (1-mandag, 7-søndag) |
%V | Årets uge i ISO 8601-format |
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.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" }
I modsætning hertil er det samme eksempel nedenfor, men ved at bruge de ikke-ISO-ugedatodele.
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, at resultatet er et helt andet.
onNull
Parameter
onNull
parameter kan bruges til at angive, hvad der skal returneres, hvis datoen er nul eller ikke eksisterer.
Værdien givet til onNull
parameter kan være et hvilket som helst gyldigt udtryk.
Her er et eksempel:
db.pets.aggregate(
[
{
$project: {
_id: 0,
dateString: { $dateToString: { date: null, onNull: "No date supplied" } }
}
}
]
)
Resultat:
{ "dateString" : "No date supplied" }
I dette tilfælde var datoen null
og så inkluderer outputdokumentet den streng, som jeg har angivet for onNull
parameter.
Returner datodelene fra et objekt-id
Du kan bruge $dateToString
for at returnere en datostreng 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 første 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 $dateToString
for at returnere en datostreng 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" },
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 dette tilfælde besluttede jeg at returnere kun datodelen (ikke tidsdelen). Jeg ændrede også rækkefølgen af dage, måneder og år for at vise, at du bestemt kan gøre dette, hvis det kræves.
Jeg brugte også $toDate
aggregeringspipeline-operatør for at returnere tidsstempeldelen af ObjectId.