Di MongoDB, $dateFromParts
operator pipeline agregasi membuat dan mengembalikan objek Date dari bagian penyusun tanggal.
Anda memberikan setiap bagian tanggal sebagai bidang terpisah.
Anda dapat menentukan bidang tanggal konstituen Anda dalam format tanggal minggu ISO jika diperlukan.
Contoh
Misalkan kita memiliki koleksi yang disebut dateParts
dengan dokumen berikut:
{ "_id" : 1, "year" : 2020, "month" : 12, "day" : 31, "hour" : 23, "minute" : 30, "second" : 25, "millisecond" : 123 }
Dokumen berisi bidang yang berbeda untuk setiap bagian tanggal.
Kita dapat menjalankan kode berikut untuk mengembalikan objek tanggal dari kolom dalam dokumen tersebut.
db.dateParts.aggregate([
{
$project: {
date: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond"
}
}
}
}])
Hasil:
{ "_id" : 1, "date" : ISODate("2020-12-31T23:30:25.123Z") }
Semua bagian tanggal/waktu telah diubah menjadi satu objek tanggal.
Zona waktu
Anda dapat menggunakan timezone
bidang untuk menentukan zona waktu.
Zona waktu dapat ditentukan menggunakan pengidentifikasi zona waktu Olson (mis. "Europe/London"
, "GMT"
) atau offset UTC (mis. "+02:30"
, "-1030"
).
Identifier Zona Waktu Olson
Berikut adalah contoh yang menggunakan ID zona waktu Olson untuk menampilkan tiga tanggal berbeda dari satu dokumen, berdasarkan tiga zona waktu berbeda.
db.dateParts.aggregate([
{
$project: {
dateUTC: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "Pacific/Auckland"
}
},
dateHonolulu: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "Pacific/Honolulu"
}
},
dateAuckland: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "Pacific/Auckland"
}
}
}
}]).pretty()
Hasil:
{ "_id" : 1, "dateUTC" : ISODate("2020-12-31T10:30:25.123Z"), "dateHonolulu" : ISODate("2021-01-01T09:30:25.123Z"), "dateAuckland" : ISODate("2020-12-31T10:30:25.123Z") }
Offset UTC
Berikut adalah contoh yang menggunakan offset UTC.
db.dateParts.aggregate([
{
$project: {
"date+00:00": {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "+00:00"
}
},
"date-10:00": {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "-10:00"
}
},
"date+12:00": {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "+12:00"
}
}
}
}]).pretty()
Hasil:
{ "_id" : 1, "date+00:00" : ISODate("2020-12-31T23:30:25.123Z"), "date-10:00" : ISODate("2021-01-01T09:30:25.123Z"), "date+12:00" : ISODate("2020-12-31T11:30:25.123Z") }
Format Tanggal Minggu ISO
Bagian tanggal dapat ditentukan menggunakan format ISO 8601 jika diperlukan.
Secara khusus, Anda dapat menggunakan:
Penentu Format | Keluaran |
---|---|
isoWeekYear | Tahun dalam format ISO 8601. Kolom ini wajib diisi jika tidak menggunakan year (dan year diperlukan jika tidak menggunakan isoWeekYear ). |
isoWeek | Minggu dalam setahun dalam format ISO 8601. Hanya dapat digunakan dengan isoWeekYear . |
isoDayOfWeek | Hari dalam seminggu (1-Senin, 7-Minggu). Hanya dapat digunakan dengan isoWeekYear . |
Misalkan kita menyisipkan dokumen kedua yang terlihat seperti ini:
{ "_id" : 2, "isoWeekYear" : 2021, "isoWeek" : 32, "isoDayOfWeek" : 7, "hour" : 23, "minute" : 30, "second" : 25, "millisecond" : 123, "timezone" : "UTC" }
Kita dapat melihat bahwa ia menggunakan isoWeekYear
, isoWeek
, dan isoDayOfWeek
bukannya year
, month
, dan day
(yang digunakan oleh dokumen pertama).
Kita dapat menggunakan kode berikut untuk membuat objek Date dari dokumen ini:
db.dateParts.aggregate([
{ $match: { _id: 2} },
{
$project: {
date: {
$dateFromParts: {
"isoWeekYear": "$isoWeekYear",
"isoWeek": "$isoWeek",
"isoDayOfWeek": "$isoDayOfWeek",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "$timezone"
}
}
}
}
])
Hasil:
{ "_id" : 2, "date" : ISODate("2021-08-15T23:30:25.123Z") }
Bidang Di Luar Jangkauan
Mulai di MongoDB 4.4, rentang nilai yang didukung untuk year
dan isoWeekYear
adalah 1-9999
. Di versi sebelumnya, batas bawah untuk nilai ini adalah 0
dan rentang nilai yang didukung adalah 0-9999
.
Mulai di MongoDB 4.0, jika nilai ditentukan untuk bidang selain year
, isoWeekYear
, dan timezone
berada di luar rentang yang valid, $dateFromParts
operator membawa atau mengurangi perbedaan dari bagian tanggal lain untuk menghitung tanggal.
Nilai Lebih Tinggi dari Rentang
Misalkan kita menambahkan dokumen berikut ke koleksi kita:
{ "_id" : 3, "year" : 2020, "month" : 14, "day" : 65, "hour" : 48, "minute" : 130, "second" : 625, "millisecond" : 123 }
Banyak bidang tanggal dan waktu dalam dokumen ini lebih tinggi dari rentang validnya masing-masing.
Mari kita jalankan perintah berikut untuk mengubahnya menjadi objek Tanggal:
db.dateParts.aggregate([
{ $match: { _id: 3} },
{
$project: {
date: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond"
}
}
}
}
])
Hasil:
{ "_id" : 3, "date" : ISODate("2021-04-08T02:20:25.123Z") }
Kita dapat melihat bahwa bagian tanggal dalam objek Tanggal yang dihasilkan berbeda dengan bagian tanggal masing-masing dalam dokumen. Ini karena $dateFromParts
menghitung ulang tanggal untuk memperhitungkan nilai bagian tanggal yang melebihi rentang normalnya.
Nilai Lebih Rendah dari Rentang
Misalkan kita menambahkan dokumen berikut ke koleksi kita:
{ "_id" : 4, "year" : 2020, "month" : 0, "day" : 0, "hour" : 0, "minute" : 0, "second" : 0, "millisecond" : 0 }
Banyak bidang tanggal dan waktu dalam dokumen ini lebih rendah dari rentang validnya masing-masing.
Mari kita jalankan perintah berikut untuk mengubahnya menjadi objek Date:
db.dateParts.aggregate([
{ $match: { _id: 4} },
{
$project: {
date: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond"
}
}
}
}
])
Hasil:
{ "_id" : 4, "date" : ISODate("2019-11-30T00:00:00Z") }