MongoDB tillhandahåller ett antal aggregeringspipeline-operatörer för att arbeta med datum, inklusive operatörer som extraherar vissa delar av datum, såsom år, månad, dag, etc.
Det finns också ett par MongoDB-metoder som gör att du kan iterera genom en markör och använda en JavaScript-funktion. Du kan därför använda JavaScript för att extrahera datumvärden och datumdelar etc från ett fält efter behov.
Den här artikeln presenterar 5 sätt att returnera månadsdelen från ett datum i MongoDB.
Exempeldata
Anta att vi har en samling som heter cats
med följande dokument:
{ "_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öljande exempel visar olika alternativ för att returnera månadsdelen från born
fältet för dessa dokument.
$month
Operatör
$month
operatören är speciellt utformad för att returnera ett dokument med månadsdelen av ett givet datum.
Vi kan köra följande kod för att returnera månaden från born
fältet i dokumentet ovan.
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthMonth: { $month: "$born" }
}
}
]
)
Resultat:
{ "birthMonth" : 1 } { "birthMonth" : 12 } { "birthMonth" : 9 }
Du kan också ange tidszonen när du använder $month
operatör.
Se MongoDB $month
för mer information och exempel.
$dateToString
Operatör
$dateToString
operatorn konverterar ett datumobjekt till en sträng enligt ett användarspecificerat format. Användaren kan därför ange att bara månadsdelen returneras om så krävs.
Det finns formatspecifikationer för varje datumdel. %m
formatspecifikationen returnerar månaden.
Exempel:
db.cats.aggregate(
[
{
$project: {
_id: 0,
birthMonth: { $dateToString: { format: "%m", date: "$born" } }
}
}
]
)
Resultat:
{ "birthMonth" : "01" } { "birthMonth" : "12" } { "birthMonth" : "09" }
Vi kunde ha tillhandahållit fler formatspecifikationer för att inkludera datumdelar i resultatet, men eftersom vi bara är intresserade av att extrahera månaden i den här artikeln använde vi bara en formatspecifikator.
Se MongoDB $dateToString
för mer information och exempel.
$dateToParts
Operatör
$dateToParts
operatören returnerar ett dokument som innehåller de beståndsdelar av ett givet BSON Date-värde som individuella egenskaper. De egenskaper som returneras är year
, month
, day
, hour
, minute
, second
och millisecond
.
Vi skulle därför kunna använda $dateToParts
i ett pipelinesteg, lägg sedan till ett annat pipelinesteg som extraherar month
del.
Här är vad $dateToParts
returnerar för våra tre dokument:
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 } }
Detta resultat kan sedan skickas till nästa steg i pipelinen för att extrahera bara month
fältet.
Här är vad som händer om vi lägger till ytterligare en projektion för bara month
fält:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
},
{
$project:
{
birthMonth: "$dateParts.month"
}
}
]
)
Resultat:
{ "birthMonth" : 1 } { "birthMonth" : 12 } { "birthMonth" : 9 }
Detta är uppenbarligen inte lika kortfattat som att använda de tidigare alternativen. Men beroende på vad du gör i din pipeline kan detta tillvägagångssätt passa räkningen.
Se MongoDB $dateToParts
för mer information och exempel.
forEach()
Metod
Du kan använda cursor.forEach()
att iterera genom markören, med en JavaScript-metod som getMonth()
eller getUTCMonth()
för att bara returnera månadsvärdet.
db.cats.find().forEach(
function(c) {
print(
c.born.getMonth()
);
}
);
Resultat:
0 11 8
Observera att getMonth()
JavaScript-metoden returnerar månadsnumret som ett heltal, mellan 0 och 11.
Du kanske också märker att de tidigare alternativen returnerar ett helt dokument som innehåller ett namn/värdepar, medan det här alternativet bara returnerar det faktiska månadsvärdet och inte hela dokumentet.
map()
Metod
cursor.map()
Metoden tillämpar en funktion på varje dokument som markören besöker och kombinerar värdena till en array.
Exempel:
db.cats.find().map(
function(c) {
c = c.born.getMonth();
return c;
}
);
Resultat:
[ 0, 11, 8 ]
Återigen får vi månaderna som heltal mellan 0 och 11.