Skip to content

emka.web.id

menulis pengetahuan – merekam peradaban

Menu
  • Home
  • Tutorial
  • Makalah
  • Ke-NU-an
  • Kabar
  • Search
Menu

Belajar MongoDB: Query Ambil Data Group By Date Range & Data Weekly

Posted on June 13, 2024

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:

  1. $match: Memfilter pekerjaan yang dibuat oleh pengguna saat ini (dengan createdBy) dan memiliki dateCreated dalam rentang waktu yang ditentukan.
  2. new Date(): Membuat objek Date baru untuk tanggal awal dan akhir.
  3. moment().startOf('week').week(-6).toDate(): Menghitung 6 minggu yang lalu dari awal minggu saat ini menggunakan moment.js. Diganti dengan new Date() untuk stabilitas produksi.
  4. moment().startOf('week').toDate(): Mendapatkan awal minggu saat ini menggunakan moment.js. Diganti dengan new 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:

  1. $addFields: Menambahkan bidang baru bernama “week” ke setiap dokumen pekerjaan. Ini berisi nomor minggu yang dihitung menggunakan $week.
  2. $group: Mengelompokkan dokumen berdasarkan bidang “week”.
  3. _id: "$week": Mendefinisikan pengenal grup sebagai nilai bidang “week”.
  4. week: { $first: "$week" }: Memberi nama grup dengan minggu pertama yang ditemukan (semuanya harus sama).
  5. 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.

Terbaru

  • Apa itu Badan Otorita Pengelola Pantai Utara Jawa (BOP Pantura)?
  • Contoh Makalah K3: Apa itu Sertifikasi K3?
  • Cara Cek Bansos September 2025
  • Ini Jadwal Kereta Bandara Adi Soemarmo Agustus 2025
  • Apa itu Jabatan Fungsional Penggerak Swadaya Masyarakat Ahli Pertama?
  • Cagongjok: Budaya Memalukan Korea, Ketika Kafe Jadi Kantor dan Ruang Belajar
  • Pengertian Anomali Brainrot
  • Penemuan DNA Denisovan Manusia Purba Amerika
  • SpaceX Akan Luncurkan Pesawat Rahasia X-37B Space Force Amerika
  • Biawak: Antara Hama dan Penjaga Ekosistem
  • Ini Profil Komjend Dedi Prasetyo Wakapolri Baru
  • Fraksi PKB DPRD Pati Tetap Selidiki Dugaan Pelanggaran Kasus RSUD Pati
  • Fraksi PKB Kritik Penggunaan Anggaran Prabowo, Fokus pada Fasilitas Publik
  • Inilah Syarat Nilai Minimal Raport Pendaftar SNBP 2026
  • Kemendikdasmen Sangkal Isu PPG Guru Tertentu Tidak Ada Lagi
  • Ini Struktur Kurikulum Kelas 5 SD/MI Sederajat Menurut Permendikdasmen No 13 Tahun 2025
  • Ini Struktur Kurikulum Kelas 3 dan 4 SD/MI Menurut Permendikdasmen No 13 Tahun 2025
  • Inilah Struktur Kurikulum Kelas 3 dan 4 SD/MI Menurut Permendikdasmen No 13 Tahun 2025
  • Ilmuwan Colorado University Bikin Particle Collider Mini, Bisa Atasi Kanker
  • Inilah Susunan Upacara Hari Kemerdekaan RI 17 Agustus di Istana Negara
  • FAKTA: Soeharto Masih Komandan PETA Saat Proklamasi Kemerdekaan RI 17 Agustus 1945
  • Materi Tes CPNS 2025: Fungsi dan Wewenang DPR/DPD
  • Cara Menjadi Siswa Eligible Daftar SNBP 2026 Terbaru!
  • Pendaftaran PPG Guru Tertentu 2025 Diperpanjang, Ini Syarat dan Caranya!
  • Struktur Kurikulum Kelas 2 SD/MI Menurut Permendikdasmen No 13 Tahun 2025
  • Ini Struktur Kurikulum Kelas 1 SD/MI Menurut Permendikdasmen No 13 Tahun 2025
  • Ini Struktur Kurikulum PAUD & TK Sederajat Menurut Permendikdasmen No 13 Tahun 2025
  • Butuh Beasiswa? Ini Beasiswa Alternatif KIP Kuliah Tahun 2025 untuk Jenjang S1
  • Butuh Bantuan SPP? Ini 5 Beasiswa SMA/SMK 2025 Yang Bisa Kamu Coba
  • Apa itu Beasiswa Mutual+ 2025, Syarat, Ketentuan dan Cara Daftarnya
  • Apa itu Badan Otorita Pengelola Pantai Utara Jawa (BOP Pantura)?
  • Contoh Makalah K3: Apa itu Sertifikasi K3?
  • Cara Cek Bansos September 2025

©2025 emka.web.id | Design: Newspaperly WordPress Theme