Artikel ini memandu Anda dalam mengambil data pekerjaan yang dibuat dalam jangka waktu tertentu (minggu) dari basis data MongoDB dan mengelompokkannya berdasarkan minggu tersebut. Ini berguna untuk visualisasi data, pelaporan, dan analisis tren.
Menyiapkan Data
Pastikan Anda memiliki basis data MongoDB dengan koleksi “Job” yang berisi dokumen pekerjaan. Setiap dokumen harus memiliki bidang dateCreated
(tanggal pembuatan) yang menyimpan tanggal dan waktu pembuatan pekerjaan. Contoh struktur dokumen:
{
"_id": "ObjectId(...)",
"company": "Perusahaan Contoh",
"position": "Manajer Produk VP",
"status": "wawancara",
"jobType": "paruh-waktu",
"jobLocation": "Kota Contoh",
"dateCreated": "2023-06-12T18:00:00.000Z",
"createdBy": "ObjectId(...)",
// Bidang lainnya
}
Queri Awal yang Tidak Sempurna
Kueri yang Anda berikan sebelumnya mungkin tidak sepenuhnya akurat. Ini menggunakan moment.js
untuk manipulasi tanggal, yang umumnya tidak disarankan untuk penggunaan produksi di Node.js. Mari kita bahas cara yang lebih baik untuk mencapai hasil yang diinginkan.
Mengambil Pekerjaan dari 6 Minggu Terakhir
Untuk mengambil semua pekerjaan yang dibuat dalam 6 minggu terakhir, kita dapat menggunakan operator $match
dan $week
dalam pipeline agregasi MongoDB:
const jobs = await Job.aggregate([
{
$match: {
createdBy: mongoose.Types.ObjectId(req.user.userId),
dateCreated: {
$gte: new Date(moment().startOf('week').week(-6).toDate()), // Gunakan Date()
$lt: new Date(moment().startOf('week').toDate())
}
}
}
]);
Penjelasan Kueri:
$match
: Memfilter pekerjaan yang dibuat oleh pengguna saat ini (dengancreatedBy
) dan memilikidateCreated
dalam rentang waktu yang ditentukan.new Date()
: Membuat objekDate
baru untuk tanggal awal dan akhir.moment().startOf('week').week(-6).toDate()
: Menghitung 6 minggu yang lalu dari awal minggu saat ini menggunakanmoment.js
. Diganti dengannew Date()
untuk stabilitas produksi.moment().startOf('week').toDate()
: Mendapatkan awal minggu saat ini menggunakanmoment.js
. Diganti dengannew Date()
untuk stabilitas produksi.
Pengelompokkan Berdasarkan Minggu
Untuk mengelompokkan pekerjaan berdasarkan minggu pembuatannya, kita dapat menggunakan operator $week
dan $group
dalam pipeline agregasi:
const groupedJobs = await Job.aggregate([
{
$match: {
createdBy: mongoose.Types.ObjectId(req.user.userId),
dateCreated: {
$gte: new Date(moment().startOf('week').week(-6).toDate()),
$lt: new Date(moment().startOf('week').toDate())
}
}
},
{
$addFields: {
week: { $week: "$dateCreated" } // Tambahkan bidang "week" untuk setiap dokumen
}
},
{
$group: {
_id: "$week", // Kelompokkan berdasarkan bidang "week"
week: { $first: "$week" }, // Ambil minggu pertama sebagai pengenal grup
jobs: { $push: "$$ROOT" } // Masukkan semua dokumen pekerjaan ke dalam array "jobs"
}
}
]);
Penjelasan Kueri:
$addFields
: Menambahkan bidang baru bernama “week” ke setiap dokumen pekerjaan. Ini berisi nomor minggu yang dihitung menggunakan$week
.$group
: Mengelompokkan dokumen berdasarkan bidang “week”._id: "$week"
: Mendefinisikan pengenal grup sebagai nilai bidang “week”.week: { $first: "$week" }
: Memberi nama grup dengan minggu pertama yang ditemukan (semuanya harus sama).jobs: { $push: "$$ROOT" }
: Memasukkan semua dokumen pekerjaan ke dalam array “jobs” untuk setiap grup minggu.
Hasil Pengelompokan Data Pekerjaan
Kueri yang terakhir dijelaskan akan menghasilkan array dokumen yang berisi grup-grup pekerjaan berdasarkan minggu pembuatannya. Setiap grup memiliki struktur seperti berikut:
{
"_id": 14, // Nomor minggu (misalnya, 14 untuk minggu ke-14)
"week": 14, // Nomor minggu (sama dengan _id)
"jobs": [
{ // Dokumen pekerjaan pertama dalam minggu ini
"_id": "ObjectId(...)",
"company": "Perusahaan Contoh",
"position": "Manajer Produk VP",
"status": "wawancara",
"jobType": "paruh-waktu",
"jobLocation": "Kota Contoh",
"dateCreated": "2023-06-12T18:00:00.000Z",
"createdBy": "ObjectId(...)",
// Bidang lainnya
},
{ // Dokumen pekerjaan kedua dalam minggu ini
"_id": "ObjectId(...)",
// ...
},
// ... Dokumen pekerjaan lainnya dalam minggu ini
]
}
Tips Tambahan:
- Anda dapat mengubah nama grup (_id) dengan menambahkan
$project
stage di akhir pipeline. - Anda dapat menambahkan agregasi lain ke pipeline untuk menghitung jumlah pekerjaan, rata-rata gaji, atau metrik lainnya untuk setiap grup minggu.
- Anda dapat menggunakan kueri ini dengan visualisasi data untuk menampilkan tren pekerjaan dari waktu ke waktu.
Kesimpulan
Dengan menggunakan operator $week
dan $group
dalam pipeline agregasi MongoDB, Anda dapat dengan mudah mengelompokkan data pekerjaan berdasarkan minggu pembuatannya. Hal ini memungkinkan Anda untuk menganalisis pola, mengidentifikasi tren, dan membuat laporan yang lebih informatif.
Ingatlah untuk mengganti penggunaan moment.js
dengan new Date()
untuk stabilitas produksi.
Sumber Daya Tambahan:
- Dokumentasi Operator
$week
: https://www.mongodb.com/docs/manual/reference/operator/aggregation/week/ - Dokumentasi Operator
$group
: https://www.mongodb.com/docs/manual/reference/operator/aggregation/group/ - Tutorial Agregasi MongoDB: https://www.mongodb.com/docs/manual/aggregation/
Catatan:
Artikel ini masih dapat dikembangkan dengan menambahkan contoh kode yang lebih detail, visualisasi data, dan analisis tren. Anda dapat berkolaborasi dengan saya untuk menambahkan informasi dan contoh yang lebih spesifik sesuai kebutuhan Anda.