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

  • Paham Semua Keluarga Model AI Gemma 4
  • Rumor Laptop Android Ternyata Bener, Ini Daftar 4 Laptop Android dari Google!
  • LCOS Lagi Naik Daun: OS Buatan Lunduke Tembus Peringkat 12 DistroWatch dan Punya Kernel Sendiri
  • Cara Pindah Data Android ke iPhone Tanpa Reset iPhone
  • Valve: Steam Deck 2 Tetap di Develop, Meski RAM Naik Harga Gila-gilaan
  • Apa itu Dumpling? dari Sejarah Sampai Tren Saat ini
  • Jadwal Event Cosplay dan Pop Culture Oktober 2026 yang Wajib Kalian Pantau
  • Cara Ganti Nama Facebook di Android, iPhone, Laptop, dan Facebook Lite Terbaru
  • Apa saja yang baru di WordPress 7.1.1?
  • Pilih Mana: XAMPP, Laragon, atau Herd Buat Belajar PHP?
  • Kenapa Views Reels Kalian Tiba-tiba Anjlok? Ini Penyebab dan Cara Ngatasinya
  • Android Bench versi 2.0 Dirilis, Apa saja Fitur Barunya?
  • MagicOS 11 dari Honor Sudah Dirilis Nih, Ini Cara Cek Smartphonemu Dapet Update Atau Nggak
  • Samsung Galaxy Z Fold 8 Jadi Makin Populer Karena iPhone Duo dirilis :)
  • Update Roku Terbaru: Redesain Tampilan & Tambah Apps dan Subscription Bundle
  • Baru! Android Auto Kasih Update ‘Custom Driving Avatar’ di Google Maps
  • Inilah Alasan Kenapa Suno Batasi Download, Mau Pindah Platform atau Terus Langganan?
  • Mengenal Apa itu Ansible
  • Cara Memilih Paket Diamond Mobile Legends Sesuai Kebutuhan dan Budget
  • Laptop Bisnis dengan Fitur Perlindungan BIOS Terbaik dari Ancaman Siber
  • Kenapa Amerika Melarang Produk Robot Vacuum Cleaner & Produk Robot Lain?
  • Rayap sebagai Tanda Ada Masalah Kelembapan di Bangunan
  • Beli HP Bekas Flagship Oppo? Ini 3 Rekomendasi Terbaik yang Masih Gahar di 2026
  • Cuma 1 Jutaan! Ini 4 Rekomendasi HP POCO yang Performa Tetap Gila di 2026
  • Inilah Rekomendasi Laptop 5-6 Jutaan Paling Worth It di Pertengahan 2026, Spek Mewah Harga Ramah!
  • Inilah Deretan Smartphone Snapdragon 8s Gen 4 yang Bikin Kompetisi HP Menengah Atas Makin Panas!
  • Mengenal Otak di Balik AI: Apa Itu LLM dan Manfaatnya dalam Keseharian Kita Menurut Sebastian Raschka
  • Inilah Rahasia Spasi FF Salin Biar Nickname Kalian Makin Keren dan Unik Tanpa Aplikasi Tambahan
  • Rekomendasi HP Kamera Bagus 2-6 Jutaan Bulan Juli 2026
  • Cuma 2 Jutaan! Ini 6 Rekomendasi HP Paling Worth It Buat Multitasking dan Gaming Ringan
  • How to Run Gemma Embedding Models Using Docker
  • Deploy Nginx Rootful Container with Podman
  • How to Sandboxing Browser on Linux Desktop with Flatpak
  • How to Hardening Journald on Linux Server (Fedora/AlmaLinux)
  • Block Bad USB on Linux Server with USBGuard
  • The Rise and Fall of the Coding Holy Grail: Is Stack Overflow Just AI Fuel Now?
  • Zyphra is The Pioneer, Why Everyone is Suddenly Obsessed with AMD and Not Just Nvidia Anymore
  • Stop Trusting Your Prompts to Save Your Business Data
  • How to Automate Your Entire SEO Strategy Using a Swarm of 100 Free AI Agents Working in Parallel
  • How to create professional presentations easily using NotebookLM’s AI power for school projects and beyond
  • Lagi nyari kode promo NordVPN buat September 2026? Cek dulu daftar kupon resminya biar nggak salah pilih paket
  • Utang BLBI katanya lunas Agustus 2026, tapi apa bener utang negara Indonesia jadi nol? Iki penjelasane
  • Waspada file FF Beta Testing x Naruto Shippuden 7z yang beredar, jangan asal download kalau nggak mau akun kena banned
  • Mengenal Mario Caesar, Personel NPD yang Lagi Naik Daun, Ternyata Anak Aktor Senior dan Saudara Raisa?
  • Info Rundown Konser The Weeknd di Jakarta 2026: Jam Berapa Mulai dan Prediksi Lagu yang Bakal Dibawain di JIS

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