MongoDB leverer en hel del aggregeringspipeline-operatører til at arbejde med datoer. Dette inkluderer 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. Dette giver dig derfor mulighed for at bruge JavaScript til at udtrække datoværdier og datodele osv. fra et felt.
Denne artikel præsenterer 6 måder at returnere årsdelen 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 årsdelen fra born
felt af disse dokumenter.
$year
Operatør
$year
operatør er det mest oplagte valg til at udtrække årsdelen fra en dato. Det er specifikt designet til at returnere et dokument med årsdelen af en dato.
Vi kan køre følgende kode for at returnere året fra den born
felt i ovenstående dokument.
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthYear: { $year: "$born" }
}
}
]
)
Resultat:
{ "birthYear" : 2021 } { "birthYear" : 2019 } { "birthYear" : 2020 }
Du kan også angive tidszonen, når du bruger $year
operatør.
Se MongoDB $year
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 årsdelen returneres, hvis det kræves.
Der er formatspecifikationer for hver datodel. %Y
formatspecifikation returnerer året.
Eksempel:
db.cats.aggregate(
[
{
$project: {
_id: 0,
birthYear: { $dateToString: { format: "%Y", date: "$born" } }
}
}
]
)
Resultat:
{ "birthYear" : "2021" } { "birthYear" : "2019" } { "birthYear" : "2020" }
Vi kunne have leveret flere formatspecifikationer for at inkludere datodele i resultatet, men da vi kun er interesseret i at udtrække årstallet 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
.
Bevæbnet med denne viden kan vi bruge $dateToParts
i én pipeline-fase, og tilføj derefter en anden pipeline-fase, der uddrager year
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 } }
Disse data kan videregives til næste trin i pipelinen for kun at udtrække year
felt.
Her er, hvad der sker, hvis vi tilføjer endnu en fremskrivning for kun year
felt:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
},
{
$project:
{
birthYear: "$dateParts.year"
}
}
]
)
Resultat:
{ "birthYear" : 2021 } { "birthYear" : 2019 } { "birthYear" : 2020 }
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 praktisk mulighed.
$dateToParts
operatøren accepterer også 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 hjælp af en JavaScript-metode såsom getFullYear()
eller getUTCFullYear()
for kun at returnere årsværdien.
db.cats.find().forEach(
function(c) {
print(
c.born.getFullYear()
);
}
);
Resultat:
2021 2019 2020
De foregående muligheder returnerer et helt dokument, der indeholder et navn/værdi-par. Denne mulighed returnerer kun den faktiske årsvæ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.getFullYear();
return c;
}
);
Resultat:
[ 2021, 2019, 2020 ]
$isoWeekYear
Operatør
Hvis du skal returnere året i ISO 8601-format, skal du bruge $isoWeekYear
. 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,
birthIsoWeekYear: { $isoWeekYear: "$born" }
}
}
]
)
Resultat:
{ "birthIsoWeekYear" : NumberLong(2020) } { "birthIsoWeekYear" : NumberLong(2019) } { "birthIsoWeekYear" : NumberLong(2020) }
Bemærk, at det første år nu er 2020 i stedet for 2021 som i de tidligere eksempler. Ikke alle år vil være forskellige, når du bruger $isoWeekYear
, fordi det afhænger af den pågældende dato.