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 Cara Pakai Google Maps Offline Biar Mudik Lebaran 2026 Nggak Nyasar Meski Tanpa Sinyal!
  • Inilah Alasan Mahkamah Agung Tolak Kasasi Google, Denda Rp202,5 Miliar Resmi Menanti Akibat Praktik Monopoli
  • Inilah Cara Daftar dan Syarat SPMB SMK Boarding Jawa Tengah 2026, Sekolah Gratis Sampai Lulus!
  • Inilah Daftar Sekolah Kedinasan 2026 untuk Lulusan SMK, Bisa Kuliah Gratis dan Berpeluang Besar Langsung Jadi CPNS!
  • Inilah Pajak TER: Skema Baru PPh 21 yang Nggak Bikin Pusing, Begini Cara Hitungnya!
  • Inilah Jadwal Resmi Jam Buka Tol Jogja-Solo Segmen Prambanan-Purwomartani Saat Mudik Lebaran 2026
  • Inilah Cara Mendapatkan Witherbloom di Fisch Roblox, Rahasia Menangkap Ikan Paling Sulit di Toxic Grove!
  • Kenapa Indomart Point Bisa Kalahkan Bisnis Kafe?
  • Inilah Cara Mendapatkan Rotten Seed di Fisch Roblox, Lokasi Rahasia di Toxic Grove Buat Unlock Toxic Lotus!
  • Inilah Cara Zakat Crypto Kalian Bisa Jadi Pengurang Pajak Berdasarkan Aturan Resmi Pemerintah!
  • Inilah Perbandingan Airwallex vs Payoneer 2026: Jangan Sampai Profit Kalian Ludes Gara-Gara Biaya Admin!
  • Inilah Roadmap 7 Tahap Bangun Bisnis Digital dari Nol Biar Nggak Cuma Putar-Putar di Tempat!
  • Inilah Cara Tetap Gajian dari YouTube Meski View Masih Ratusan, Penasaran?
  • Inilah Alasan Akun TikTok Affiliate GMV 270 Juta Kena Banned Permanen!
  • Inilah Bahaya Astute Beta Server APK, Jangan Sembarang Klik Link Download FF Kipas 2026!
  • Inilah Bahaya Nonton Film di LK21 dan IndoXXI, Awas Data Pribadi dan Saldo Rekening Kalian Bisa Ludes!
  • Inilah Kronologi & Video Lengkap Kasus Sejoli Tambelangan Sampang Viral, Ternyata Gini Awal Mulanya!
  • Inilah Alasan Kenapa Koin Nego Neko Shopee Nggak Bisa Dipakai Bayar Full dan Cara Rahasia Dapetinnya!
  • Inilah Cara Menjawab Pertanyaan Apakah di Sekolahmu Sudah Ada IFP/PID dengan Benar dan Profesional
  • Inilah Fakta Isu Roblox Diblokir di Indonesia 2026, Benarkah Akan Ditutup Total?
  • Inilah Penyebab dan Cara Mengatasi FF Kipas My ID Verify UID Biar Akun Tetap Aman
  • Inilah Deretan HP RAM 8GB Harga di Bawah 2 Juta Terbaik 2026, Spek Dewa Tapi Nggak Bikin Kantong Jebol!
  • Contoh Cara Buat SK Panitia TKA 2026
  • Inilah Cara Download Point Blank ID Versi Terbaru 2026, Gampang Banget Ternyata!
  • Inilah Persiapan Lengkap Gladi Bersih TKA 2026 SD dan SMP: Jadwal, Teknis Proktor, dan Aturan yang Wajib Kalian Tahu
  • Inilah Aturan Lengkapnya, Apakah Zakat dalam Bentuk Barang Bisa Mengurangi Pajak Penghasilan Kalian?
  • Inilah Kenapa KBLI Sangat Penting Buat Bisnis Digital dan Gini Caranya Biar Kalian Nggak Salah Pilih Kode
  • Inilah Fitur Keren ONLYOFFICE Docs 9.3, Cara Baru Edit PDF dan Dokumen Lebih Efisien!
  • Inilah Cara Banjir Komisi Shopee Affiliate Hanya Dalam 7 Hari Saja
  • Cara Download Aplikasi BUSSID Versi 3.7.1 Masih Dicari dan Link Download Aman Mediafire
  • How to Enable SSH in Oracle VirtualBox for Beginners
  • How to Intercept Secret IoT Camera Traffic
  • Build Ultra-Fast and Tiny Desktop Apps with Electrobun: A Beginner’s Guide
  • The Ultimate 2026 Coding Roadmap: How to Master Software Engineering with AI Agents
  • How to Master Cloud Infrastructure with Ansible and Terraform
  • How to Have OpenClaw Agent that Work for You 24/7/365?
  • A Complete Guide to Using Abacus.AI Deep Agent for Research and AI Presentation Generator
  • How to Setup Clawdbot Computer Agents Client
  • Bytedance Helios: How to Generate Real-Time Long AI Videos on Your Own Computer
  • New Perplexity AI Feature, March 2026 is Insane
  • 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

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