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":