När du extraherar dagen från ett datum beror det exakta alternativet vi använder på hur vi vill att dagen ska representeras.
Vill vi till exempel ha veckodagen, månaden eller dagen på året? Eller kanske vi vill ha den i ISO 8601-format? Returvärdet kommer vanligtvis att vara olika beroende på vilken vi väljer.
Den här artikeln utforskar dessa alternativ och presenterar därför 8 sätt att returnera dagdelen 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 dagdelen från born
fältet för dessa dokument.
$dayOfWeek
Operatör
Som namnet antyder, $dayOfWeek
operatören returnerar veckodagen från ett datum.
Vi kan köra följande kod för att returnera veckodagen från born
fältet i dokumentet ovan.
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfWeek: { $dayOfWeek: "$born" }
}
}
]
)
Resultat:
{ "birthDayOfWeek" : 1 } { "birthDayOfWeek" : 1 } { "birthDayOfWeek" : 5 }
Det är också möjligt att ange tidszonen när du använder $dayOfWeek
operatör.
Se MongoDB $dayOfWeek
för mer information och exempel.
$dayOfMonth
Operatör
$dayOfMonth
operatören returnerar dagen i månaden från ett datum.
Exempel:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfMonth: { $dayOfMonth: "$born" }
}
}
]
)
Resultat:
{ "birthDayOfMonth" : 3 } { "birthDayOfMonth" : 8 } { "birthDayOfMonth" : 24 }
Du kan också ange tidszonen när du använder $dayOfMonth
operatör.
Se MongoDB $dayOfMonth
för mer information och exempel.
$dayOfYear
Operatör
Japp, du gissade rätt. $dayOfYear
operatören returnerar dagen på året från ett datum.
Exempel:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfYear: { $dayOfYear: "$born" }
}
}
]
)
Resultat:
{ "birthDayOfYear" : 3 } { "birthDayOfYear" : 342 } { "birthDayOfYear" : 268 }
$dayOfYear
operatören accepterar också en tidszonsparameter.
Se MongoDB $dayOfYear
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 endast dagsdelen returneras om så krävs.
Det finns formatspecifikationer för varje datumdel, och när det kommer till dagdelen har du ett val av formatspecifikationer som beror på om du vill returnera veckodagen, månadsdagen, dagen på året eller veckodag i ISO 8601-format.
Exempel:
db.cats.aggregate(
[
{
$project: {
_id: 0,
birthDayOfWeek: { $dateToString: { format: "%w", date: "$born" } },
birthDayOfMonth: { $dateToString: { format: "%d", date: "$born" } },
birthDayOfYear: { $dateToString: { format: "%j", date: "$born" } },
birthDayOfWeekISO: { $dateToString: { format: "%u", date: "$born" } }
}
}
]
).pretty()
Resultat:
{ "birthDayOfWeek" : "1", "birthDayOfMonth" : "03", "birthDayOfYear" : "003", "birthDayOfWeekISO" : "7" } { "birthDayOfWeek" : "1", "birthDayOfMonth" : "08", "birthDayOfYear" : "342", "birthDayOfWeekISO" : "7" } { "birthDayOfWeek" : "5", "birthDayOfMonth" : "24", "birthDayOfYear" : "268", "birthDayOfWeekISO" : "4" }
Vi kunde ha tillhandahållit fler formatspecifikationer för att inkludera andra datumdelar i resultatet, men eftersom vi bara är intresserade av att extrahera dagen i den här artikeln, använde vi bara formatspecifikationer för att returnera dagdelen.
Se MongoDB $dateToString
för mer information och exempel.
Se även MongoDB $dateToString
Formatspecifikationer för en lista med formatspecifikationer som du kan använda med $dateToString
.
$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 kan därför använda $dateToParts
i ett pipelinesteg, lägg sedan till ett annat pipelinesteg som extraherar day
del om det behövs.
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 } }
Dessa data kan skickas till nästa steg i pipelinen för att bara extrahera day
fältet.
Här är vad som händer om vi lägger till ytterligare en projektion för bara day
fält:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
},
{
$project:
{
birthDay: "$dateParts.day"
}
}
]
)
Resultat:
{ "birthDay" : 3 } { "birthDay" : 8 } { "birthDay" : 24 }
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 vara ett alternativ.
Det är också värt att nämna att $dateToParts
accepterar en iso8601
parameter, som ändrar utdatadokumentet för att använda ISO-veckodatumfält.
Se MongoDB $dateToParts
för mer information och exempel.
forEach()
Metod
Du kan använda cursor.forEach()
att iterera genom markören, med hjälp av en JavaScript-metod för att bara returnera dagsvärdet.
db.cats.find().forEach(
function(c) {
print(
c.born.getDay()
);
}
);
Resultat:
1 0 4
I det här fallet använder vi JavaScript getDay()
metod, som returnerar ett heltal, mellan 0 och 6, motsvarande veckodagen för det givna datumet, enligt lokal tid.
Ett annat alternativ är att använda getUTCDay()
metod, som använder universell tid. Vi kommer att använda den här metoden i nästa exempel.
Alternativt kunde vi ha använt JavaScript getDate()
metod, som returnerar ett heltal, mellan 1 och 31, som representerar dagen i månaden för det givna datumet.
Dessutom returnerar det här alternativet bara det faktiska dagsvärdet, och inte hela dokumentet, som i de tidigare exemplen.
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.getUTCDay();
return c;
}
);
Resultat:
[ 0, 0, 4 ]
Som nämnts, JavaScript getUTCDay()
metod returnerar sitt resultat med universell tid. I det här fallet resulterade det i att ett annat värde returnerades för det första dokumentet (vi fick 0
i det här exemplet, kontra 1
i den föregående).
$isoDayOfWeek
Operatör
Om du behöver returnera veckodagen i ISO 8601-format kan du använda $isoDayOfWeek
. ISO 8601-året börjar med måndagen i vecka 1 och slutar med söndagen i sista veckan.
Exempel:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
}
}
]
)
Resultat:
{ "birthIsoDayOfWeek" : 7 } { "birthIsoDayOfWeek" : 7 } { "birthIsoDayOfWeek" : 4 }
I det här fallet får vi ett helt annat resultat än vi fick när vi använde $dayOfWeek
operatör, på grund av hur ISO 8601 beräknar datum.
Här är ett exempel som visar denna skillnad:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfWeek: { $dayOfWeek: "$born" },
birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
}
}
]
)
Resultat:
{ "birthDayOfWeek" : 1, "birthIsoDayOfWeek" : 7 } { "birthDayOfWeek" : 1, "birthIsoDayOfWeek" : 7 } { "birthDayOfWeek" : 5, "birthIsoDayOfWeek" : 4 }