Saat mengekstrak hari dari sebuah tanggal, opsi yang tepat yang kita gunakan akan bergantung pada bagaimana kita ingin hari itu direpresentasikan.
Misalnya, apakah kita menginginkan hari dalam seminggu, hari dalam sebulan, atau hari dalam setahun? Atau mungkin kita menginginkannya dalam format ISO 8601? Nilai return biasanya akan berbeda tergantung mana yang kita pilih.
Artikel ini mengeksplorasi opsi tersebut, dan karenanya menyajikan 8 cara untuk mengembalikan porsi hari dari tanggal di MongoDB.
Contoh Data
Misalkan kita memiliki koleksi yang disebut cats
dengan dokumen sebagai berikut:
{ "_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") }
Contoh berikut menunjukkan berbagai opsi untuk mengembalikan porsi hari dari born
bidang dokumen tersebut.
$dayOfWeek
Operator
Sesuai dengan namanya, $dayOfWeek
operator mengembalikan hari dalam seminggu dari tanggal.
Kita dapat menjalankan kode berikut untuk mengembalikan hari dalam seminggu dari born
bidang dalam dokumen di atas.
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfWeek: { $dayOfWeek: "$born" }
}
}
]
)
Hasil:
{ "birthDayOfWeek" : 1 } { "birthDayOfWeek" : 1 } { "birthDayOfWeek" : 5 }
Anda juga dapat menentukan zona waktu saat menggunakan $dayOfWeek
operator.
Lihat MongoDB $dayOfWeek
untuk informasi dan contoh lebih lanjut.
$dayOfMonth
Operator
$dayOfMonth
operator mengembalikan hari dalam sebulan dari tanggal.
Contoh:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfMonth: { $dayOfMonth: "$born" }
}
}
]
)
Hasil:
{ "birthDayOfMonth" : 3 } { "birthDayOfMonth" : 8 } { "birthDayOfMonth" : 24 }
Anda juga dapat menentukan zona waktu saat menggunakan $dayOfMonth
operator.
Lihat MongoDB $dayOfMonth
untuk informasi dan contoh lebih lanjut.
$dayOfYear
Operator
Ya, Anda dapat menebaknya. $dayOfYear
operator mengembalikan hari dalam setahun dari tanggal.
Contoh:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfYear: { $dayOfYear: "$born" }
}
}
]
)
Hasil:
{ "birthDayOfYear" : 3 } { "birthDayOfYear" : 342 } { "birthDayOfYear" : 268 }
$dayOfYear
operator juga menerima parameter zona waktu.
Lihat MongoDB $dayOfYear
untuk informasi dan contoh lebih lanjut.
$dateToString
Operator
$dateToString
operator mengonversi objek tanggal menjadi string menurut format yang ditentukan pengguna. Oleh karena itu, pengguna dapat menentukan bahwa hanya bagian hari yang dikembalikan jika diperlukan.
Ada penentu format untuk setiap bagian tanggal, dan jika menyangkut porsi hari, Anda memiliki pilihan penentu format yang akan bergantung pada apakah Anda ingin mengembalikan hari dalam seminggu, hari dalam sebulan, hari dalam setahun, atau hari dalam seminggu dalam format ISO 8601.
Contoh:
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()
Hasil:
{ "birthDayOfWeek" : "1", "birthDayOfMonth" : "03", "birthDayOfYear" : "003", "birthDayOfWeekISO" : "7" } { "birthDayOfWeek" : "1", "birthDayOfMonth" : "08", "birthDayOfYear" : "342", "birthDayOfWeekISO" : "7" } { "birthDayOfWeek" : "5", "birthDayOfMonth" : "24", "birthDayOfYear" : "268", "birthDayOfWeekISO" : "4" }
Kami dapat menyediakan lebih banyak penentu format untuk menyertakan bagian tanggal lainnya dalam hasil, tetapi karena kami hanya tertarik untuk mengekstrak hari dalam artikel ini, kami hanya menggunakan penentu format untuk mengembalikan porsi hari.
Lihat MongoDB $dateToString
untuk informasi dan contoh lebih lanjut.
Lihat juga MongoDB $dateToString
Penentu Format untuk daftar penentu format yang dapat Anda gunakan dengan $dateToString
.
$dateToParts
Operator
$dateToParts
operator mengembalikan dokumen yang berisi bagian konstituen dari nilai Tanggal BSON yang diberikan sebagai properti individual. Properti yang dikembalikan adalah year
, month
, day
, hour
, minute
, second
dan millisecond
.
Oleh karena itu, kami dapat menggunakan $dateToParts
dalam satu tahap saluran, lalu tambahkan tahap saluran lain yang mengekstrak day
bagian jika diperlukan.
Ini dia $dateToParts
pengembalian untuk tiga dokumen kami:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
}
]
).pretty()
Hasil:
{ "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 } }
Data ini dapat diteruskan ke tahap berikutnya dalam pipeline untuk mengekstrak day
lapangan.
Inilah yang terjadi jika kita menambahkan proyeksi lain hanya untuk day
bidang:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
},
{
$project:
{
birthDay: "$dateParts.day"
}
}
]
)
Hasil:
{ "birthDay" : 3 } { "birthDay" : 8 } { "birthDay" : 24 }
Ini jelas tidak sesingkat menggunakan opsi sebelumnya. Namun, bergantung pada apa yang Anda lakukan di jalur Anda, pendekatan ini bisa menjadi pilihan.
Perlu juga disebutkan bahwa $dateToParts
menerima iso8601
parameter, yang memodifikasi dokumen keluaran untuk menggunakan bidang tanggal minggu ISO.
Lihat MongoDB $dateToParts
untuk informasi dan contoh lebih lanjut.
The forEach()
Metode
Anda dapat menggunakan cursor.forEach()
untuk beralih melalui kursor, menggunakan metode JavaScript untuk mengembalikan nilai hari saja.
db.cats.find().forEach(
function(c) {
print(
c.born.getDay()
);
}
);
Hasil:
1 0 4
Dalam hal ini, kami menggunakan JavaScript getDay()
metode, yang mengembalikan bilangan bulat, antara 0 dan 6, sesuai dengan hari dalam seminggu untuk tanggal yang ditentukan, menurut waktu setempat.
Pilihan lainnya adalah dengan menggunakan getUTCDay()
metode yang menggunakan waktu universal. Kami akan menggunakan metode ini dalam contoh berikutnya.
Atau, kita bisa menggunakan JavaScript getDate()
metode, yang mengembalikan bilangan bulat, antara 1 dan 31, yang mewakili hari dalam sebulan untuk tanggal yang ditentukan.
Juga, opsi ini hanya mengembalikan nilai hari yang sebenarnya, dan bukan keseluruhan dokumen, seperti pada contoh sebelumnya.
map()
Metode
cursor.map()
metode menerapkan fungsi ke setiap dokumen yang dikunjungi oleh kursor dan menggabungkan nilai ke dalam array.
Contoh:
db.cats.find().map(
function(c) {
c = c.born.getUTCDay();
return c;
}
);
Hasil:
[ 0, 0, 4 ]
Seperti disebutkan, JavaScript getUTCDay()
metode mengembalikan hasilnya menggunakan waktu universal. Dalam hal ini, ini menghasilkan nilai berbeda yang dikembalikan untuk dokumen pertama (kami mendapatkan 0
dalam contoh ini, versus 1
di yang sebelumnya).
$isoDayOfWeek
Operator
Jika Anda perlu mengembalikan hari dalam seminggu dalam format ISO 8601, Anda dapat menggunakan $isoDayOfWeek
. Tahun ISO 8601 dimulai dengan hari Senin minggu 1 dan berakhir dengan hari Minggu minggu terakhir.
Contoh:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
}
}
]
)
Hasil:
{ "birthIsoDayOfWeek" : 7 } { "birthIsoDayOfWeek" : 7 } { "birthIsoDayOfWeek" : 4 }
Dalam hal ini kami mendapatkan hasil yang sama sekali berbeda dari yang kami dapatkan saat menggunakan $dayOfWeek
operator, karena cara ISO 8601 menghitung tanggal.
Berikut adalah contoh yang menunjukkan perbedaan ini:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfWeek: { $dayOfWeek: "$born" },
birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
}
}
]
)
Hasil:
{ "birthDayOfWeek" : 1, "birthIsoDayOfWeek" : 7 } { "birthDayOfWeek" : 1, "birthIsoDayOfWeek" : 7 } { "birthDayOfWeek" : 5, "birthIsoDayOfWeek" : 4 }