Při extrakci dne z data bude přesná volba, kterou použijeme, záviset na tom, jak chceme, aby byl den reprezentován.
Chceme například den v týdnu, den v měsíci nebo den v roce? Nebo jej snad chceme ve formátu ISO 8601? Návratová hodnota se bude obvykle lišit podle toho, kterou zvolíme.
Tento článek zkoumá tyto možnosti, a proto představuje 8 způsobů, jak vrátit část dne z data v MongoDB.
Ukázková data
Předpokládejme, že máme sbírku nazvanou cats
s následujícími dokumenty:
{ "_id" :1, "name" :"Scratch", "born" :ISODate("2021-01-03T23:30:15.123Z") }{ "_id" :2, "name" :" Mňau", "born" :ISODate("2019-12-08T04:00:12Z") }{ "_id" :3, "name" :"Fluffy", "born" :ISODate("2020-09-24T10:30:00 Z") }
Následující příklady ukazují různé možnosti pro vrácení části dne z born
pole těchto dokumentů.
$dayOfWeek
Operátor
Jak název napovídá, $dayOfWeek
operátor vrátí den v týdnu z data.
Můžeme spustit následující kód a vrátit den v týdnu z born
pole ve výše uvedeném dokumentu.
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfWeek: { $dayOfWeek: "$born" }
}
}
]
)
Výsledek:
{ "birthDayOfWeek" :1 }{ "birthDayOfWeek" :1 }{ "birthDayOfWeek" :5 }
Při použití $dayOfWeek
je také možné zadat časové pásmo operátor.
Viz MongoDB $dayOfWeek
pro další informace a příklady.
$dayOfMonth
Operátor
$dayOfMonth
operátor vrátí den v měsíci z data.
Příklad:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfMonth: { $dayOfMonth: "$born" }
}
}
]
)
Výsledek:
{ "birthDayOfMonth" :3 }{ "birthDayOfMonth" :8 }{ "birthDayOfMonth" :24 }
Při použití $dayOfMonth
můžete také určit časové pásmo operátor.
Viz MongoDB $dayOfMonth
pro další informace a příklady.
$dayOfYear
Operátor
Jo, uhodli jste. $dayOfYear
operátor vrátí den v roce z data.
Příklad:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfYear: { $dayOfYear: "$born" }
}
}
]
)
Výsledek:
{ "birthDayOfYear" :3 }{ "birthDayOfYear" :342 }{ "birthDayOfYear" :268 }
$dayOfYear
operátor také přijímá parametr časového pásma.
Viz MongoDB $dayOfYear
pro další informace a příklady.
$dateToString
Operátor
$dateToString
operátor převede objekt data na řetězec podle uživatelem zadaného formátu. Uživatel tedy může určit, že se v případě potřeby vrátí pouze část dne.
Pro každou část data existují specifikátory formátu, a pokud jde o část dne, máte na výběr ze specifikátorů formátu, které budou záviset na tom, zda chcete vrátit den v týdnu, den v měsíci, den v roce nebo den v týdnu ve formátu ISO 8601.
Příklad:
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()
Výsledek:
{ "birthDayOfWeek" :"1", "birthDayOfMonth" :"03", "birthDayOfYear" :"003", "birthDayOfWeekISO" :"7"}{ "birthDayOfWeek" :"1", "MthbirthDay":08", "birthDayOfYear" :"342", "birthDayOfWeekISO" :"7"}{ "birthDayOfWeek" :"5", "birthDayOfMonth" :"24", "birthDayOfYear" :"268", "narozeni:O "}
Mohli jsme poskytnout více specifikátorů formátu, abychom do výsledku zahrnuli další části data, ale protože nás v tomto článku zajímá pouze extrahování dne, použili jsme specifikátory formátu pouze pro vrácení části dne.
Viz MongoDB $dateToString
pro další informace a příklady.
Viz také MongoDB $dateToString
Specifikátory formátu pro seznam specifikátorů formátu, které můžete použít s $dateToString
.
$dateToParts
Operátor
$dateToParts
operátor vrátí dokument, který obsahuje součásti dané hodnoty BSON Date jako jednotlivé vlastnosti. Vrácené vlastnosti jsou year
, month
, day
, hour
, minute
, second
a millisecond
.
Můžeme tedy použít $dateToParts
v jedné fázi potrubí a poté přidejte další fázi potrubí, která extrahuje day
část v případě potřeby.
Zde je to, co $dateToParts
vrací pro naše tři dokumenty:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
}
]
).pretty()
Výsledek:
{ "dateParts" :{ "rok" :2021, "měsíc" :1, "den" :3, "hodina" :23, "minuta" :30, "sekunda" :15, "milisekunda" :123 }}{ "dateParts" :{ "rok" :2019, "měsíc" :12, "den" :8, "hodina" :4, "minuta" :0, "sekunda" :12, "milisekunda" :0 } }{ "dateParts" :{ "rok" :2020, "měsíc" :9, "den" :24, "hodina" :10, "minuta" :30, "sekunda" :0, "milisekunda" :0 }}
Tato data lze předat do další fáze procesu, kde se extrahuje pouze day
pole.
Co se stane, když přidáme další projekci pouze na day
pole:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
},
{
$project:
{
birthDay: "$dateParts.day"
}
}
]
)
Výsledek:
{ "birthDay" :3 }{ "birthDay" :8 }{ "birthDay" :24 }
To samozřejmě není tak stručné jako použití předchozích možností. V závislosti na tom, co ve svém kanálu děláte, však může být tento přístup možností.
Za zmínku také stojí, že $dateToParts
přijímá iso8601
parametr, který upravuje výstupní dokument tak, aby používal pole data týdne podle ISO.
Viz MongoDB $dateToParts
pro další informace a příklady.
The forEach()
Metoda
Můžete použít cursor.forEach()
iterovat kurzorem pomocí metody JavaScript k vrácení pouze hodnoty dne.
db.cats.find().forEach(
function(c) {
print(
c.born.getDay()
);
}
);
Výsledek:
104
V tomto případě používáme JavaScript getDay()
metoda, která vrací celé číslo mezi 0 a 6, které odpovídá dni v týdnu pro dané datum podle místního času.
Další možností je použít getUTCDay()
metoda, která využívá univerzální čas. Tuto metodu použijeme v dalším příkladu.
Případně jsme mohli použít JavaScript getDate()
metoda, která vrací celé číslo mezi 1 a 31, které představuje den v měsíci pro dané datum.
Tato možnost také vrací pouze skutečnou hodnotu dne, nikoli celý dokument, jako v předchozích příkladech.
map()
Metoda
cursor.map()
metoda aplikuje funkci na každý dokument navštívený kurzorem a kombinuje hodnoty do pole.
Příklad:
db.cats.find().map(
function(c) {
c = c.born.getUTCDay();
return c;
}
);
Výsledek:
[ 0, 0, 4 ]
Jak již bylo zmíněno, JavaScript getUTCDay()
metoda vrací svůj výsledek pomocí univerzálního času. V tomto případě to vedlo k vrácení jiné hodnoty pro první dokument (dostali jsme 0
v tomto příkladu oproti 1
v předchozím).
$isoDayOfWeek
Operátor
Pokud potřebujete vrátit den v týdnu ve formátu ISO 8601, můžete použít $isoDayOfWeek
. Rok ISO 8601 začíná pondělím týdne 1 a končí nedělí posledního týdne.
Příklad:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
}
}
]
)
Výsledek:
{ "birthIsoDayOfWeek" :7 }{ "birthIsoDayOfWeek" :7 }{ "birthIsoDayOfWeek" :4 }
V tomto případě dostaneme úplně jiný výsledek, než jaký jsme dostali při použití $dayOfWeek
operátora kvůli způsobu, jakým ISO 8601 vypočítává data.
Zde je příklad, který tento rozdíl demonstruje:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfWeek: { $dayOfWeek: "$born" },
birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
}
}
]
)
Výsledek:
{ "birthDayOfWeek" :1, "birthIsoDayOfWeek" :7 }{ "birthDayOfWeek" :1, "birthIsoDayOfWeek" :7 }{ "birthDayOfWeek" :5, "birthIsoDayOfWeek":5, "birthIsoDayOfWeek":