Skip to content

emka.web.id

menulis pengetahuan – merekam peradaban

Menu
  • Home
  • Tutorial
  • 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

  • Inilah Kenapa AI Sering Jadi Kambing Hitam Saat PHK Massal, Padahal Masalahnya Bukan Itu!
  • Inilah Cara Baru Cepat Monetisasi YouTube Tanpa Trik Musik, Cuma 2 Bulan Langsung Cuan!
  • Inilah Kapan Pengumuman SNBP 2026 Jam Berapa Lengkap dengan Cara Cek Hasil Kelulusannya
  • Belum Tahu? Inilah Cara Zakat Perusahaan Kalian Bisa Jadi Pengurang Pajak Penghasilan Bruto!
  • Inilah Cara Menggabungkan Grid Foto Online dan Hapus Background Foto
  • Kenapa Youtuber Mulai Harus Hati-hati Pakai AI: Bisa Digugat dan Kehilangan Hak Cipta!
  • Inilah Alasan Kenapa Sumbangan ke Tempat Ibadah Biasa Nggak Bisa Langsung Jadi Pemotong Pajak!
  • Belum Tahu? Inilah Cara Pasang Iklan Meta Ads untuk Sales WiFi Supaya Banjir Closingan!
  • Inilah Alur Pengerjaan EMIS GTK 2026 yang Benar dari Awal Sampai Akhir
  • Inilah 27 Sekolah Kedinasan untuk Lulusan SMK 2026, Bisa Kuliah Gratis dan Langsung Jadi CPNS!
  • Inilah Cara Kuliah S2 di Inggris dengan GREAT Scholarship 2026: Syarat Lengkap, Daftar Kampus, dan Tips Jitu Biar Lolos!
  • Belum Tahu? Inilah Alasan Non-Muslim Juga Bisa Ngurangin Pajak Pake Sumbangan Keagamaan Wajib!
  • Inilah Kenapa Zakat ke Pondok Pesantren Mungkin Nggak Bisa Jadi Pengurang Pajak, Yuk Cek Syaratnya!
  • Inilah Caranya Daftar SMA Unggul Garuda Baru 2026 yang Diperpanjang, Cek Syarat dan Link Resminya!
  • Cara Cek Pencairan KJP Plus Tahap 1 Januari 2026 Beserta Daftar Nominal Lengkapnya
  • Lengkap! Inilah Kronologi Meninggalnya Vidi Aldiano Berjuang Melawan Kanker
  • Inilah Cara Tarik Data PKH di EMIS 4.0 Agar Bantuan Siswa Tetap Cair!
  • Inilah Trik Jitu SEO Shopee untuk Pemula: Jualan Laris Manis Tanpa Perlu Bakar Duit Iklan!
  • Inilah Peluang Emas Jadi Karyawan BUMN Tanpa Ngantre: Program Ikatan Kerja ULBI 2026
  • Inikah Daftar CPNS Kemenkeu 2026? Cek 48 Jurusan yang Paling Dibutuhkan!
  • Inilah 4 Beasiswa Khusus Warga ASEAN dengan Peluang Lolos Lebih Tinggi, Kalian Wajib Tahu!
  • Inilah Alasan Ribuan Dosen ASN Melayangkan Surat Keberatan Soal Tukin 2020-2024 yang Belum Cair
  • Cara Dapat Diamond Free Fire Gratis 2026, Pemain FF Harus Tahu!
  • Inilah Cara Mengisi Presensi EMIS GTK IMP 2026 Terbaru Biar Tunjangan Lancar
  • Inilah Trik Hashtag Viral Supaya Video Shorts Kalian Nggak Sepi Penonton Lagi
  • Inilah Jawabannya, Apakah Zakat Fitrah Kalian Bisa Mengurangi Pajak Penghasilan?
  • Inilah Caranya Supaya Komisi TikTok dan Shopee Affiliate Tetap Stabil Pasca Ramadhan!
  • Inilah 10 Kesalahan Fatal Saat Beli Properti yang Bisa Bikin Kalian Bangkrut!
  • Belum Tahu Cara Masuk Simpatika Terbaru? Ini Cara Login PTK EMIS GTK IMP 2026 Supaya Cek TPG Jadi Lebih Gampang!
  • Inilah Cara Bikin Konten Animasi AI Cuma Modal HP Supaya Bisa Gajian Rutin dari YouTube
  • How to Generate Battery Report in Windows 11: A Simple Guide
  • How to Setting Up a Pro-Level Security System with Reolink and Frigate NVR
  • How to Install DaVinci Resolve on Nobara Linux and Fix Video Compatibility Issues Like a Pro
  • How to Master GitHub’s New Power Tools: Copilot CLI, Dashboards, and More!
  • How to Create and Configure DNS Server on RHEL 10
  • Securing LLM with Agentverse (Secure and Scalable Inference)
  • ModernBERT: Why the Encoder-Only Model is Making a Massive Comeback in AI History
  • How to Build Your First AI App with Lovable AI Today!
  • OpenClaw Tutorial: A Step-by-Step Guide to Coding Your Very First Website from Scratch!
  • Seedance 2.0 Is Here! Unlimited + Completely Uncensored AI Video Gen
  • Apa itu Spear-Phishing via npm? Ini Pengertian dan Cara Kerjanya yang Makin Licin
  • Apa Itu Predator Spyware? Ini Pengertian dan Kontroversi Penghapusan Sanksinya
  • Mengenal Apa itu TONESHELL: Backdoor Berbahaya dari Kelompok Mustang Panda
  • Siapa itu Kelompok Hacker Silver Fox?
  • Apa itu CVE-2025-52691 SmarterMail? Celah Keamanan Paling Berbahaya Tahun 2025
Beli Pemotong Rumput dengan Baterai IRONHOOF 588V Mesin Potong Rumput 88V disini https://s.shopee.co.id/70DBGTHtuJ
Beli Morning Star Kursi Gaming/Kantor disini: https://s.shopee.co.id/805iTUOPRV

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