Di MongoDB, $year
operator pipa agregasi mengembalikan bagian tahun dari tanggal tertentu.
Saat menggunakan $year
operator, Anda dapat secara opsional menentukan zona waktu yang akan digunakan untuk hasil.
$year
operator menerima baik tanggal (baik sebagai Tanggal, Timestamp, atau ObjectId), atau dokumen yang menentukan tanggal dan zona waktu untuk digunakan.
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 tahun dari born
bidang dalam dokumen itu.
db.pets.aggregate(
[
{
$project:
{
_id: 0,
birthYear: { $year: "$born" }
}
}
]
)
Hasil:
{ "birthYear" : 2020 }
Kita dapat melihat bahwa tahun 2020
dikembalikan.
Di sini, saya menggunakan birthYear
sebagai nama bidang yang akan ditampilkan, tetapi ini bisa berupa apa saja (seperti yearBorn
, year
, dll).
_id
bidang dikembalikan secara default saat menggunakan proyeksi di MongoDB, tetapi dalam contoh ini saya secara eksplisit menyembunyikan _id
kolom menggunakan _id: 0
.
Tentukan Zona Waktu
Anda dapat menentukan zona waktu yang akan digunakan untuk output $year
operator.
Saat Anda melakukan ini, argumen diteruskan ke $year
harus dalam bentuk berikut:
{ date: <dateExpression>, timezone: <tzExpression> }
Dimana <dateExpression>
adalah tanggal untuk digunakan, dan <tzExpression>
adalah zona waktu yang digunakan.
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 tahun dalam dua zona waktu yang berbeda, masing-masing menggunakan ID zona waktu Olson:
db.pets.aggregate(
[
{
$project: {
_id: 0,
honolulu: {
$year: { date: "$born", timezone: "Pacific/Honolulu" }
},
auckland: {
$year: { date: "$born", timezone: "Pacific/Auckland" }
}
}
}
]
)
Hasil:
{ "honolulu" : 2020, "auckland" : 2021 }
Dalam hal ini, tanggal bergerak maju ke tahun berikutnya saat menggunakan Pacific/Auckland
zona waktu.
Offset UTC
Ini contoh yang sama, kecuali kali ini kita menggunakan offset UTC.
db.pets.aggregate(
[
{
$project: {
_id: 0,
"utcOffset-1000": {
$year: { date: "$born", timezone: "-1000" }
},
"utcOffset+1200": {
$year: { date: "$born", timezone: "+1200" }
}
}
}
]
)
Hasil:
{ "utcOffset-1000" : 2020, "utcOffset+1200" : 2021 }
Mengembalikan Tahun dari ObjectId
Anda dapat menggunakan $year
untuk mengembalikan bagian tahun 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 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 $year
untuk mengembalikan tahun pembuatan dokumen kita (atau lebih khusus lagi, saat _id
nilai ObjectId bidang telah dibuat).
Contoh:
db.pets.aggregate(
[
{
$project:
{
"timeStamp": { $toDate: "$_id"},
"year": { $year: "$_id" }
}
}
]
).pretty()
Hasil:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "timeStamp" : ISODate("2021-01-19T01:11:35Z"), "year" : 2021 }
Kita dapat melihat bahwa dokumen tersebut dibuat pada tahun 2021.
Dalam hal ini, saya juga menggunakan $toDate
operator pipeline agregasi untuk mengembalikan bagian stempel waktu ObjectId.
Tahun ISO
Anda juga dapat menggunakan $isoWeekYear
operator untuk mengembalikan tahun penomoran minggu ISO (yaitu nomor tahun menggunakan format ISO 8601).