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.