Di MongoDB, $dateToString
operator pipa agregasi mengonversi objek tanggal tertentu menjadi string.
$dateToString
operator menerima baik Date, Timestamp, atau ObjectId.
Anda dapat menentukan format yang akan digunakan untuk hasil dengan memberikan spesifikasi format. Spesifikasi format dapat berupa string literal apa pun, yang berisi 0 atau lebih penentu format.
Spesifikasi format adalah opsional dari MongoDB versi 4.0, ketika featureCompatibilityVersion
diatur ke 4.0
atau lebih tinggi. Versi sebelumnya memerlukan spesifikasi format.
Anda dapat secara opsional menggunakan timezone
parameter untuk menentukan zona waktu yang akan digunakan.
Anda juga dapat menggunakan onNull
parameter untuk menentukan apa yang harus dikembalikan jika tanggalnya null
atau hilang.
Contoh
Misalkan kita memiliki koleksi yang disebut pets
dengan dokumen berikut:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "name" : "Fetch", "born" : ISODate("2020-12-31T23:30:15.123Z") }
Kita dapat menjalankan kode berikut untuk mengembalikan string tanggal dari kode born
bidang dalam dokumen itu.
db.pets.aggregate(
[
{
$project: {
_id: 0,
dateString: { $dateToString: { format: "%Y-%m-%dT%H:%M:%S.%LZ", date: "$born" } }
}
}
]
)
Hasil:
{ "dateString" : "2020-12-31T23:30:15.123Z" }
Contoh ini menggunakan %Y-%m-%dT%H:%M:%S.%LZ
sebagai spesifikasi format. Ini merupakan spesifikasi format default, tetapi dalam hal ini kami secara eksplisit menentukannya. Kita dapat melihat bahwa string tanggal dikembalikan menggunakan format yang ditentukan.
Di sini, saya menggunakan dateString
sebagai nama bidang yang akan dikembalikan, tetapi ini bisa berupa apa saja (seperti formattedDate
, theDate
dll).
_id
bidang dikembalikan secara default saat menggunakan proyeksi di MongoDB, tetapi dalam contoh ini saya secara eksplisit menyembunyikan _id
kolom menggunakan _id: 0
.
Lihat MongoDB $dateToString
Penentu Format untuk daftar penentu format yang tersedia.
Keluaran Default
Seperti yang disebutkan, spesifikasi format pada contoh sebelumnya adalah spesifikasi format default.
Jika Anda menggunakan MongoDB versi 4.0 atau lebih tinggi, dengan featureCompatibilityVersion
setel ke 4.0
atau lebih tinggi (lihat cara melihat featureCompatibilityVersion
Anda saat ini dan cara mengaturnya), Anda dapat menghilangkan spesifikasi format jika Anda ingin tanggal diformat menggunakan format di atas.
Oleh karena itu, kita bisa menulis ulang sebelumnya. contoh untuk ini:
db.pets.aggregate(
[
{
$project: {
_id: 0,
dateString: { $dateToString: { date: "$born" } }
}
}
]
)
Hasil:
{ "dateString" : "2020-12-31T23:30:15.123Z" }
Tentukan Zona Waktu
Anda dapat menentukan zona waktu yang akan digunakan untuk output $dateToString
operator.
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 menampilkan string tanggal dalam tiga zona waktu berbeda, masing-masing menggunakan ID zona waktu Olson:
db.pets.aggregate(
[
{
$project: {
_id: 0,
UTC: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "UTC" } },
Honolulu: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "Pacific/Honolulu" } },
Auckland: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "Pacific/Auckland" } }
}
}
]
).pretty()
Hasil:
{ "UTC" : "2020-12-31T23:30", "Honolulu" : "2020-12-31T13:30", "Auckland" : "2021-01-01T12:30" }
Offset UTC
Berikut adalah contoh yang menggunakan offset UTC.
db.pets.aggregate(
[
{
$project: {
_id: 0,
UTC: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "+00:00" } },
Honolulu: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "-10:00" } },
Auckland: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "+12:00" } }
}
}
]
).pretty()
Hasil:
{ "UTC" : "2020-12-31T23:30", "Honolulu" : "2020-12-31T13:30", "Auckland" : "2021-01-01T11:30" }
Format Tanggal Minggu ISO
Ada beberapa penentu format yang memungkinkan Anda menampilkan string tanggal menggunakan format ISO 8601.
Secara khusus, Anda dapat menggunakan:
Penentu Format | Keluaran |
---|---|
%G | Tahun dalam format ISO 8601 |
%u | Nomor hari dalam seminggu dalam format ISO 8601 (1-Senin, 7-Minggu) |
%V | Minggu Tahun dalam format ISO 8601 |
Misalkan kita memiliki koleksi yang disebut cats
dengan dokumen berikut:
{ "_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"), "name" : "Scratch", "born" : ISODate("2021-01-03T23:30:15.123Z") }
Kita dapat menjalankan kode berikut untuk mengekstrak bidang tanggal ISO dari kode born
bidang dalam dokumen itu.
Berikut ini contoh untuk didemonstrasikan:
db.cats.aggregate(
[
{
$project: {
_id: 0,
isoYear: { $dateToString: { format: "%G", date: "$born" } },
isoDayOfWeek: { $dateToString: { format: "%u", date: "$born" } },
isoWeekOfYear: { $dateToString: { format: "%V", date: "$born" } }
}
}
]
)
Hasil:
{ "isoYear" : "2020", "isoDayOfWeek" : "7", "isoWeekOfYear" : "53" }
Sebaliknya, di bawah ini adalah contoh yang sama, tetapi menggunakan bagian tanggal minggu non-ISO.
db.cats.aggregate(
[
{
$project: {
_id: 0,
year: { $dateToString: { format: "%Y", date: "$born" } },
dayofweek: { $dateToString: { format: "%w", date: "$born" } },
weekofyear: { $dateToString: { format: "%U", date: "$born" } }
}
}
]
)
Hasil:
{ "year" : "2021", "dayofweek" : "1", "weekofyear" : "01" }
Kita dapat melihat bahwa hasilnya benar-benar berbeda.
onNull
Parameter
onNull
parameter dapat digunakan untuk menentukan apa yang harus dikembalikan jika tanggalnya nol atau tidak ada.
Nilai yang diberikan ke onNull
parameter dapat berupa ekspresi apa pun yang valid.
Ini contohnya:
db.pets.aggregate(
[
{
$project: {
_id: 0,
dateString: { $dateToString: { date: null, onNull: "No date supplied" } }
}
}
]
)
Hasil:
{ "dateString" : "No date supplied" }
Dalam hal ini, tanggalnya adalah null
dan dokumen keluaran menyertakan string yang saya berikan untuk onNull
parameter.
Kembalikan Bagian Tanggal dari ObjectId
Anda dapat menggunakan $dateToString
untuk mengembalikan string tanggal dari ObjectId.
Nilai ObjectId adalah nilai heksadesimal 12 byte yang terdiri dari:
- Nilai cap waktu 4 byte, mewakili pembuatan ObjectId, diukur dalam detik sejak zaman Unix.
- 5 byte adalah nilai acak
- Penghitung pertambahan 3 byte, diinisialisasi ke nilai acak.
Untuk rekap, dokumen pertama kami terlihat seperti ini:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "name" : "Fetch", "born" : ISODate("2020-12-31T23:30:15.123Z") }
Dokumen ini berisi ObjectId. Oleh karena itu, kita dapat menggunakan $dateToString
untuk mengembalikan string tanggal, berdasarkan tanggal pembuatan dokumen kita (atau lebih khusus lagi, saat _id
nilai ObjectId bidang telah dibuat).
Contoh:
db.pets.aggregate(
[
{
$project: {
timestamp: { $toDate: "$_id" },
dateString: { $dateToString: { format: "%d-%m-%Y", date: "$_id" } }
}
}
]
).pretty()
Hasil:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "timestamp" : ISODate("2021-01-19T01:11:35Z"), "dateString" : "19-01-2021" }
Dalam hal ini, saya memutuskan untuk mengembalikan hanya bagian tanggal (bukan bagian waktu). Saya juga mengubah urutan hari, bulan, dan tahun untuk menunjukkan bahwa Anda pasti dapat melakukan ini jika diperlukan.
Saya juga menggunakan $toDate
operator pipa agregasi untuk mengembalikan bagian stempel waktu ObjectId.