Når du trækker dagen ud fra en dato, vil den nøjagtige mulighed, vi bruger, afhænge af, hvordan vi ønsker, at dagen skal repræsenteres.
Vil vi for eksempel have ugedagen, månedsdagen eller årets dag? Eller måske vil vi have det i ISO 8601-format? Returværdien vil normalt være forskellig alt efter hvilken vi vælger.
Denne artikel undersøger disse muligheder og præsenterer derfor 8 måder at returnere dagdelen fra en dato i MongoDB.
Eksempel på data
Antag, at vi har en samling kaldet cats
med følgende dokumenter:
{ "_id" : 1, "name" : "Scratch", "born" : ISODate("2021-01-03T23:30:15.123Z") } { "_id" : 2, "name" : "Meow", "born" : ISODate("2019-12-08T04:00:12Z") } { "_id" : 3, "name" : "Fluffy", "born" : ISODate("2020-09-24T10:30:00Z") }
Følgende eksempler viser forskellige muligheder for at returnere dagdelen fra born
felt af disse dokumenter.
$dayOfWeek
Operatør
Som navnet antyder, er $dayOfWeek
operatør returnerer ugedagen fra en dato.
Vi kan køre følgende kode for at returnere ugedagen fra born
felt i ovenstående dokument.
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfWeek: { $dayOfWeek: "$born" }
}
}
]
)
Resultat:
{ "birthDayOfWeek" : 1 } { "birthDayOfWeek" : 1 } { "birthDayOfWeek" : 5 }
Det er også muligt at angive tidszonen, når du bruger $dayOfWeek
operatør.
Se MongoDB $dayOfWeek
for mere information og eksempler.
$dayOfMonth
Operatør
$dayOfMonth
operatør returnerer dagen i måneden fra en dato.
Eksempel:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfMonth: { $dayOfMonth: "$born" }
}
}
]
)
Resultat:
{ "birthDayOfMonth" : 3 } { "birthDayOfMonth" : 8 } { "birthDayOfMonth" : 24 }
Du kan også angive tidszonen, når du bruger $dayOfMonth
operatør.
Se MongoDB $dayOfMonth
for mere information og eksempler.
$dayOfYear
Operatør
Ja, du gættede det. $dayOfYear
operatør returnerer dagen i året fra en dato.
Eksempel:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfYear: { $dayOfYear: "$born" }
}
}
]
)
Resultat:
{ "birthDayOfYear" : 3 } { "birthDayOfYear" : 342 } { "birthDayOfYear" : 268 }
$dayOfYear
operatøren accepterer også en tidszoneparameter.
Se MongoDB $dayOfYear
for mere information og eksempler.
$dateToString
Operatør
$dateToString
operator konverterer et datoobjekt til en streng i henhold til et brugerspecificeret format. Brugeren kan derfor angive, at kun dagsdelen returneres, hvis det kræves.
Der er formatspecifikationer for hver datodel, og når det kommer til dagsdelen, har du et valg af formatspecifikationer, der vil afhænge af, om du vil returnere ugedag, dag i måned, dag i år eller ugedag i ISO 8601-format.
Eksempel:
db.cats.aggregate(
[
{
$project: {
_id: 0,
birthDayOfWeek: { $dateToString: { format: "%w", date: "$born" } },
birthDayOfMonth: { $dateToString: { format: "%d", date: "$born" } },
birthDayOfYear: { $dateToString: { format: "%j", date: "$born" } },
birthDayOfWeekISO: { $dateToString: { format: "%u", date: "$born" } }
}
}
]
).pretty()
Resultat:
{ "birthDayOfWeek" : "1", "birthDayOfMonth" : "03", "birthDayOfYear" : "003", "birthDayOfWeekISO" : "7" } { "birthDayOfWeek" : "1", "birthDayOfMonth" : "08", "birthDayOfYear" : "342", "birthDayOfWeekISO" : "7" } { "birthDayOfWeek" : "5", "birthDayOfMonth" : "24", "birthDayOfYear" : "268", "birthDayOfWeekISO" : "4" }
Vi kunne have leveret flere formatspecifikationer for at inkludere andre datodele i resultatet, men da vi kun er interesseret i at udtrække dagen i denne artikel, brugte vi kun formatspecifikationer til at returnere dagdelen.
Se MongoDB $dateToString
for mere information og eksempler.
Se også MongoDB $dateToString
Formatspecifikationer for en liste over formatspecifikationer, som du kan bruge med $dateToString
.
$dateToParts
Operatør
$dateToParts
operatør returnerer et dokument, der indeholder de bestanddele af en given BSON Date-værdi som individuelle egenskaber. De returnerede egenskaber er year
, month
, day
, hour
, minute
, second
og millisecond
.
Vi kan derfor bruge $dateToParts
i én pipeline-fase, og tilføj derefter en anden pipeline-fase, der uddrager day
del om nødvendigt.
Her er hvad $dateToParts
returnerer for vores tre dokumenter:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
}
]
).pretty()
Resultat:
{ "dateParts" : { "year" : 2021, "month" : 1, "day" : 3, "hour" : 23, "minute" : 30, "second" : 15, "millisecond" : 123 } } { "dateParts" : { "year" : 2019, "month" : 12, "day" : 8, "hour" : 4, "minute" : 0, "second" : 12, "millisecond" : 0 } } { "dateParts" : { "year" : 2020, "month" : 9, "day" : 24, "hour" : 10, "minute" : 30, "second" : 0, "millisecond" : 0 } }
Disse data kan videregives til næste trin i pipelinen for kun at udtrække day
felt.
Her er, hvad der sker, hvis vi tilføjer endnu en projektion for kun day
felt:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
},
{
$project:
{
birthDay: "$dateParts.day"
}
}
]
)
Resultat:
{ "birthDay" : 3 } { "birthDay" : 8 } { "birthDay" : 24 }
Dette er åbenbart ikke så kortfattet som at bruge de tidligere muligheder. Men afhængigt af hvad du laver i din pipeline, kan denne tilgang være en mulighed.
Det er også værd at nævne, at $dateToParts
accepterer en iso8601
parameter, som ændrer outputdokumentet til at bruge ISO-ugedatofelter.
Se MongoDB $dateToParts
for mere information og eksempler.
forEach()
Metode
Du kan bruge cursor.forEach()
at iterere gennem markøren ved at bruge en JavaScript-metode til kun at returnere dagsværdien.
db.cats.find().forEach(
function(c) {
print(
c.born.getDay()
);
}
);
Resultat:
1 0 4
I dette tilfælde bruger vi JavaScript getDay()
metode, som returnerer et helt tal, mellem 0 og 6, svarende til ugedagen for den givne dato, i henhold til lokal tid.
En anden mulighed er at bruge getUTCDay()
metode, som bruger universel tid. Vi bruger denne metode i det næste eksempel.
Alternativt kunne vi have brugt JavaScript getDate()
metode, som returnerer et helt tal mellem 1 og 31, der repræsenterer dagen i måneden for den givne dato.
Denne mulighed returnerer også kun den faktiske dagsværdi og ikke hele dokumentet, som i de foregående eksempler.
map()
Metode
cursor.map()
metoden anvender en funktion på hvert dokument, der besøges af markøren og kombinerer værdierne i en matrix.
Eksempel:
db.cats.find().map(
function(c) {
c = c.born.getUTCDay();
return c;
}
);
Resultat:
[ 0, 0, 4 ]
Som nævnt er JavaScript getUTCDay()
metoden returnerer sit resultat ved hjælp af universel tid. I dette tilfælde resulterede det i, at en anden værdi blev returneret for det første dokument (vi fik 0
i dette eksempel versus 1
i den forrige).
$isoDayOfWeek
Operatør
Hvis du skal returnere ugedagen i ISO 8601-format, kan du bruge $isoDayOfWeek
. ISO 8601-året starter med mandagen i uge 1 og slutter med søndagen i den sidste uge.
Eksempel:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
}
}
]
)
Resultat:
{ "birthIsoDayOfWeek" : 7 } { "birthIsoDayOfWeek" : 7 } { "birthIsoDayOfWeek" : 4 }
I dette tilfælde får vi et helt andet resultat, end vi fik ved brug af $dayOfWeek
operatør, på grund af den måde, ISO 8601 beregner datoer på.
Her er et eksempel, der viser denne forskel:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfWeek: { $dayOfWeek: "$born" },
birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
}
}
]
)
Resultat:
{ "birthDayOfWeek" : 1, "birthIsoDayOfWeek" : 7 } { "birthDayOfWeek" : 1, "birthIsoDayOfWeek" : 7 } { "birthDayOfWeek" : 5, "birthIsoDayOfWeek" : 4 }