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

  • Belum Tahu? Inilah Cara Aman Login Binomo dan Trik Trading Buat Pemula Biar Nggak Boncos
  • Cara Mengatasi Error ‘Versi Diagnostik Belum Terbarui’ (Your current version of diagnostics is not up to date)
  • Cara Membuat Newsletter di Outlook 365
  • Sering Telepon di Tempat Berisik? Fitur Baru Expressive Call dari Google Bakal Jadi Penyelamat Kalian!
  • Google Pixel 10 Pro Akan Punya Integrasi Play Points Lebih Dalam
  • Stop Cara Kuno! Ini Trik Supaya Manajemen Karyawan Jadi Lebih Cepat dan Anti Ribet
  • Bug di Aplikasi Cuaca Wear OS Google: Update Tidak Ngaruh!
  • Samsung Kembangkan Sensor Kamera Baru Pakai Teknologi Global Shutter dan Efek Blur Bergerak
  • Cara Membuat Anggaran Otomatis di Excel
  • Baseus X1 Pro Kamera: Kamera Ringkas dengan Fitur Canggih dan Harga yang Menarik
  • Profil Sosmed Kalian Sepi? Gini Caranya Makeover Bio Biar Makin Dilirik Sama Netizen!
  • Cara Mengatasi Error ‘Disk is Full or Read-Only’
  • Belum Tahu? Inilah Trik Ampuh Atasi Error ‘We Were Unable To Create Your Notebook’ di OneNote
  • Trik Instagram Stories 2025: Ubah Viewer Jadi Loyal Follower dengan Fitur Sederhana Ini
  • Turning TikTok into a Money-Making Machine
  • Cara Ekstrak Driver Intel RST/VMD dari setuprst.exe: Panduan Lengkap
  • Pixel 8 dan 8 Pro Akan Punya Kamera Baru Resolusi 10.2MP, Hasil Lebih Baik di Kondisi Redup
  • Inilah Trik Website Kalian Lolos Core Web Vitals dan Ranking Naik
  • YouTube TV Uji Coba Fitur Tonton Rekaman Pertandingan Olahraga NFL,NBA, MLB Terbatas
  • Aawi Wireless Dua Habis Stok, Model Android Auto Tunggal Masih Diskon
  • Samsung Akan Luncurkan One UI 8.5 dengan Inspirasi ‘Liquid Glass’ yang Memukau
  • XBox Game Pass PC Tidak Bisa Address GPU ke Game
  • Your Pocket-Sized Doctors: 3 Health Apps Changing the Game on Android and iOS
  • Waymo Bawa Teknologi ‘Liquid Glass’ untuk Mobil Otonom
  • Rumor Google Akan Update UI Besar-besaran Desember 2025
  • Gemini Akan Masuk di Android Auto, Mobil Jadi Lebih Smart!
  • OpenAI Bantah Rencana Pasang Iklan di ChatGPT Berlangganan
  • Kenapa Komputer Sangat Panas Saat Gunakan Fitur Virtualisasi Hyper-V?
  • Apa itu Bug React2Shell? Sudah Serang Lebih dari 30 Organisasi dan 77.000 IP Address
  • Google Store Black Friday 2025: Penawaran Spesial untuk Pixel, Nest, dan Lainnya!
  • Ini Dia ESP32 P4: IoT RISC-V dengan Layar AMOLED dan LoRa, Perangkat Handheld Inovatif
  • Apa Itu HealthyPi-6? Solusi Open Source untuk Akuisisi Biosignal
  • Jetson THOR Industrial PC: 25Gbe Networking dan Bisa Pakai Kamera GMSL2
  • Azul Systems Akuisisi Payara Java Server
  • PC Kentang Jadi Ngebut? Coba GRML 2025, Distro Debian Ringan dengan Kernel 6.17!
  • Apa Itu US National Framework for AI? Kepres Donald Trump Bikin Heboh Dunia AI
  • Kenapa Bisnis Properti & Real Estate Harus Pakai AI, Ini Alasannya!
  • BARU! Brave Browser Bakal Bisa Ngerjain Tugas Kalian Secara Otomatis Lewat Agentic AI!
  • Belum Tahu? Google Maps Bakal Makin Canggih Berkat Integrasi Gemini Visual Ini!
  • Siap-Siap! Tahun 2026 Gemini Bakal “Menjajah” Chrome, iPhone, sampai Smartwatch Kalian
  • Apa Itu Ashen Lepus? Kelompok Peretas yang Mengincar Instansi Pemerintah Timur Tengah
  • Pengertian Vulnerability WebKit Apple Terbaru: Apa Itu CVE-2025-43529 dan CVE-2025-14174?
  • Apa Itu Fake OSINT? Definisi dan Bahaya Repositori GitHub Palsu
  • Apa Itu GenAI Browser Security? Ini Definisi dan Strategi Pengamanannya
  • Apa Itu CVE-2025-58360? Ini Pengertian Celah Keamanan GeoServer Terbaru

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