MongoDB tilbyder et godt udvalg af aggregerede pipeline-operatører til at arbejde med datoer, herunder operatører, der uddrager bestemte dele af datoer, såsom år, måned, dag, timer, minutter osv.
Der er også et par MongoDB-metoder, der giver dig mulighed for at iterere gennem en markør og anvende en JavaScript-funktion. Du kan derfor bruge JavaScript til at udtrække datoværdier og datodele osv. fra et felt efter behov.
Denne artikel præsenterer 5 måder at returnere timedelen fra et Date-objekt 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") }
De følgende eksempler viser forskellige muligheder for at returnere timedelen fra born
felt af disse dokumenter.
$hour
Operatør
$hour
operatør er specifikt designet til at returnere et dokument med timedelen af en given dato.
Vi kan køre følgende kode for at returnere timedelen fra born
felt i ovenstående dokument.
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthHour: { $hour: "$born" }
}
}
]
)
Resultat:
{ "birthHour" : 23 } { "birthHour" : 4 } { "birthHour" : 10 }
Du kan også angive tidszonen, når du bruger $hour
operatør.
Se MongoDB $hour
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 timeportionen returneres, hvis det kræves.
Der er formatspecifikationer for hver datodel. %H
formatspecifikationen returnerer timen.
Eksempel:
db.cats.aggregate(
[
{
$project: {
_id: 0,
birthHour: { $dateToString: { format: "%H", date: "$born" } }
}
}
]
)
Resultat:
{ "birthHour" : "23" } { "birthHour" : "04" } { "birthHour" : "10" }
Vi kunne have leveret flere formatspecifikationer for at inkludere datodele i resultatet, men da vi kun er interesserede i at udtrække timen i denne artikel, brugte vi kun én formatspecifikation.
Se MongoDB $dateToString
for mere information og eksempler.
$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 kunne derfor bruge $dateToParts
i et pipeline-trin, tilføj derefter et andet pipeline-trin, der uddrager hour
del.
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 } }
Dette resultat kan derefter overføres til næste trin i pipelinen for kun at udtrække hour
felt.
Her er, hvad der sker, hvis vi tilføjer endnu en projektion for kun hour
felt:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
},
{
$project:
{
birthHour: "$dateParts.hour"
}
}
]
)
Resultat:
{ "birthHour" : 23 } { "birthHour" : 4 } { "birthHour" : 10 }
Pointen her er, hvis du bruger $dateToParts
i din pipeline har du automatisk adgang til timedelen (og alle andre portioner) i næste fase.
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 såsom getHours()
eller getUTCHours()
for kun at returnere timeværdien.
db.cats.find().forEach(
function(c) {
print(
c.born.getUTCHours()
);
}
);
Resultat:
23 4 10
getUTCHours()
JavaScript-metoden returnerer et heltal mellem 0 og 23, der repræsenterer timerne på den givne dato i henhold til universel tid.
Du kan også bemærke, at de tidligere muligheder returnerer et helt dokument, der indeholder et navn/værdi-par, hvorimod denne mulighed kun returnerer den faktiske timeværdi og ikke hele dokumentet.
map()
Metode
cursor.map()
metoden anvender en funktion på hvert dokument, der besøges af markøren og kombinerer værdierne til en matrix.
Eksempel:
db.cats.find().map(
function(c) {
c = c.born.getHours();
return c;
}
);
Resultat:
[ 9, 14, 20 ]
Du har måske bemærket, at de resulterende timer er anderledes end de foregående eksempler. Det er fordi jeg i dette eksempel brugte getHours()
JavaScript metode. Denne metode returnerer sit resultat i henhold til lokal tid. Jeg kunne lige så nemt have brugt getUTCHours()
.