MongoDB leverer en række aggregerede pipeline-operatører til at arbejde med datoer, herunder operatører, der uddrager bestemte dele af datoer, såsom år, måned, dag 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 månedsdelen 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 månedsdelen fra born
felt af disse dokumenter.
$month
Operatør
$month
operatør er specifikt designet til at returnere et dokument med månedsdelen af en given dato.
Vi kan køre følgende kode for at returnere måneden fra den born
felt i ovenstående dokument.
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthMonth: { $month: "$born" }
}
}
]
)
Resultat:
{ "birthMonth" : 1 } { "birthMonth" : 12 } { "birthMonth" : 9 }
Du kan også angive tidszonen, når du bruger $month
operatør.
Se MongoDB $month
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 månedsdelen returneres, hvis det kræves.
Der er formatspecifikationer for hver datodel. %m
formatspecifikation returnerer måneden.
Eksempel:
db.cats.aggregate(
[
{
$project: {
_id: 0,
birthMonth: { $dateToString: { format: "%m", date: "$born" } }
}
}
]
)
Resultat:
{ "birthMonth" : "01" } { "birthMonth" : "12" } { "birthMonth" : "09" }
Vi kunne have leveret flere formatspecifikationer for at inkludere datodele i resultatet, men da vi kun er interesserede i at udtrække måneden 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-stadium, og tilføj derefter et andet pipeline-stadium, der uddrager month
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 month
felt.
Her er, hvad der sker, hvis vi tilføjer endnu en projektion for kun month
felt:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
},
{
$project:
{
birthMonth: "$dateParts.month"
}
}
]
)
Resultat:
{ "birthMonth" : 1 } { "birthMonth" : 12 } { "birthMonth" : 9 }
Dette er åbenbart ikke så kortfattet som at bruge de tidligere muligheder. Afhængigt af, hvad du laver i din pipeline, kan denne tilgang dog passe regningen.
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 getMonth()
eller getUTCMonth()
for kun at returnere månedsværdien.
db.cats.find().forEach(
function(c) {
print(
c.born.getMonth()
);
}
);
Resultat:
0 11 8
Bemærk, at getMonth()
JavaScript-metoden returnerer månedsnummeret som et heltal mellem 0 og 11.
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 månedsvæ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 i en matrix.
Eksempel:
db.cats.find().map(
function(c) {
c = c.born.getMonth();
return c;
}
);
Resultat:
[ 0, 11, 8 ]
Igen får vi månederne som heltal mellem 0 og 11.