Latihan Mongodb PART 2 : Grouping Documents Dan Contoh Penggunaan Join

Belajar Mongodb

Lanjut dari pembahasan sebelumnya disini kita akan mencoba praktek basic collection method dari nosql mongodb, setelah sebelumnya kita praktek membuat crud sederhana dengan collection method find(), insert(), remove(), update(), kita lanjut dengan grouping dan join, sebenarnya nosql itu tidak disesain untuk kebutuhan relational seperti join tapi mongodb menyediakan case jika kita mendadak membutuhkan join, istilah join di mongodb disebut lookup atau $lookup.

Di pembahasan kali ini kita akan mencoba praktek dan membahas sedikit materi nya, di dalam pengolahan data grouping sangat di perlukan baik itu untuk kebutuhan report ataupun kebutuhan lainnya, bisa di bayangkan jika di dalam sql tidak ada yang namanya grouping kita query satu-satu menggunakan kondisi where wkwkwk, okay kita skip dulu aja langsung ke praktek berikut daftar isi dari pembahan kita kali ini.


Praktek Grouping Data

Di dalam ruang lingkup database (basis data) grouping data sangat di perlukan untuk kebutuhan report biasanya, baik itu berupa aggregate angka atau mengelompokan data berdasarkan kolom yang di ingin kan misalkan. Kita ingin mengelompokan data buku berdasarkan tanggal terbit di sinilah fungsi grouping data di perlukan, mari kita coba praktet dengan menggunakan schema sebelumnya yang sudah kita buat di part 1 langsung saja kita praktek, buat collection baru dengan nama books , seperti biasa untuk GUI kita menggunakan aplikasi nosqlbooster jika teman-teman belum menginstallnya dan lupa cara untuk membuat collections nya bisa baca tutorial pertama nya https://koboykampussukabumi.blogspot.com/2020/11/latihan-mongodb-part-1-crud-dan-operator.html untuk collection books setelah kita membuat nya lalu kita masukan data dummy sebagai berikut

db.books.insert([
    {
        'name':'buku 1',
        'id_kategori':'',
        'tahun_terbit': 2010,
        'penulis': 'tes'
    },{
        'name':'buku 2',
        'id_kategori':'',
        'tahun_terbit': 2010,
        'penulis': 'tes'
    },{
        'name':'buku 3',
        'id_kategori':'',
        'tahun_terbit': 2020,
        'penulis': 'tes 1'
    },{
        'name':'buku 4',
        'id_kategori':'',
        'tahun_terbit': 2020,
        'penulis': 'tes 1'
    }
])

Mungkin kita akan mencoba beberapa skenario untuk praktek nya diantaranya sebagai berikut

  • grouping data biasa
  • grouping data dengan output custom menggunakan $project
  • grouping data dan menghitung jumlahnya
  • grouping data dengan kondisi 

Kita coba dengan skenario pertama berikut kode nya

db.books.aggregate([
    {
        // $group perintah untuk grouping
        $group: {
             // _id ini wajib ada sedangkan setelah : itu nama kolom yang akan kita grouping
            _id: '$tahun_terbit'
        }
    }
])

Result nya akan seperti ini

/* 1 */
{
"_id" :
2020
},
/* 2 */
{
"_id" :
2010
}

Skenario kedua grouping dengan custom result

db.books.aggregate([
    {
    	// $group perintah untuk grouping
        $group: {
             // _id ini wajib ada sedangkan setelah : itu nama kolom yang akan kita grouping
            _id: '$tahun_terbit'
            
        }
    },{
    	// custom output untuk ditampilkan nanti berupa json
        $project: {
            // key dan value harus menggunakan $ awalnya
            tahun:"$_id"
        }
    }
])

Result nya akan seperti ini

/* 1 */
{
"_id": 2010,
"tahun": 2010
},
/* 2 */
{
"_id": 2020,
"tahun": 2020
}

Skenario ketiga grouping dan menghitung jumlah data yang di grup

db.books.aggregate([
    {
    	// $group perintah untuk grouping
        $group: {
             // _id ini wajib ada sedangkan setelah : itu nama kolom yang akan kita grouping
            _id: '$tahun_terbit',
            // untuk perhitungan menggunakan $sum 
            total:  { "$sum": 1 }
        }
    },{
    	// custom output untuk ditampilkan nanti berupa json
        $project: {
            // key dan value harus menggunakan $ awalnya
            tahun:"$_id",
            total:"$total"
        }
    }
])

Result nya akan seperti ini

/* 1 */
{
"_id": 2020,
"tahun": 2020,
"total": 2
},
/* 2 */
{
"_id": 2010,
"tahun": 2010,
"total": 2
}

Skenario ke empat grouping dengan menggunakan kondisi

db.books.aggregate([
    // menggunakan $match untuk mencari berdasarkan kondisi kolom tertentu
    { $match : {
        // kolom dan value
        penulis: "tes"
    }},
    {
    	// $group perintah untuk grouping
        $group: {
             // _id ini wajib ada sedangkan setelah : itu nama kolom yang akan kita grouping
            _id: '$tahun_terbit',
            total:  { "$sum": 1 }
        }
    },{
    	// custom output untuk ditampilkan nanti berupa json
        $project: {
            // key dan value harus menggunakan $ awalnya
            tahun:"$_id",
            total:"$total"
        }
    }
])

Result nya akan seperti ini

{
"_id": 2010,
"tahun": 2010,
"total": 2
}

Sofar mungkin itu adalah praktek sederhana nya, teman-teman bisa membuka dokumentasi lengkapnya di situs resminya https://docs.mongodb.com/manual/reference/operator/aggregation/group/ disitu sudah lengkap dengan berbagai operator nya disini kita baru mempraktekan dengan operator $match untuk pengkondisian atau filter ketika akan menampilkan data dan juga $sum untuk menghitung jumlah data sesuai yang kita kelompokan.

Saran untuk teman-teman supaya bisa lebih paham lanjtukan dengan ber eksperimen membuat collection baru dan coba untuk grouping data lagi dan mencoba dengan operator lain yang ada di situs nya supaya mengasah kemapuan teman-teman untuk lebih ahli lagi.


Kenapa ada join di mongodb ?

Mungkin akan timbul pertanyaan seperti itu mongodb kan bukan relasional jadi tidak mungkin ada join, ini juga merupakan salah satu faktor yang menjadi kan mongodb populer di lingkup nosql karena ada fitur join layaknya relasional database. Dalam satu kasus penggunaan join ini sangat tidak disarankan karena ya balik lagi ke prinsip dasar jika datanya relasional berarti menggunakan database yang mendukung relasional jika data sudah di normalisasi kan semua ke dalam satu tabel atau collection nosql bisa menjadi pilihan.

Penggunaan join ini hanya di gunakan untuk kasus jika aplikasi udah jalan dan jadi sedangkan jika ada kasus untuk kebutuhan datanya perlu di pisah collection nya sehingga membutuhkan join disinilah baru peran join bisa digunakan di mongodb, atau mungkin bisa jug menggunakan multi database hehehe, jika dari awal desain kita sudah ok sangat tidak disaranakan sih untuk menggunakan join karena akan lemot dari segi perpormance nya. Gambaran query join di mongodb proses nya  akan seperti pada gambar di bawah ini

Query join di mongodb

Mungkin nanti akan timbul pertanyaan kenapa membuat tutorial nya jika tidak disarankan ?, nah jawaban nya yaitu untuk case jika sistem kita sudah besar dan nanti ada kasus butuh memisahkan collection satu dengan collection lain nya tapi saling berhubungan ini semua berdasarkan pengalaman pribadi sih hehehe. Tutorial ini hanya sebagai pembelajaran aja bagi kita supaya tepat dalam memilih, memecahkan masalah dalam kondisi tertentu di nosql mongodb.

Untuk dokumentasi lengkapnya ada disitus ini silahkan teman-teman pelajari dan baca-baca di situs resminya https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/index.html


Praktek join dengan menggunakan operator $lookup

Langkah pertama buat collection baru lagi dengan nama category dan buat data dummy nya seperti ini

db.category.insert([{
    'name': 'teknologi',
}, {
    'name': 'informasi',
}])

setelah kita punya collection baru dengan nama category schema tersebut nanti akan saling berelasi dengan schema books mari kita ubah salah satu data yang ada di schema books dengan memasukan ObjectId(_id) dari collection category ke books.

db.books.update({ _id: ObjectId("5fec273679670010168296cd") }, {
    $set: {
        "name": "buku 3",
        "id_kategori": ObjectId("5ff2692af1d6de2fdc6aca7b"),
        "tahun_terbit": 2020,
        "penulis": "tes 1"
    }
})

sebagai catatan perlu di ingat jika ingin membuat relasi menggunakan kolom _id tipe data nya wajib ObjectId jika tidak maka tidak akan bisa di relasi

Mari kita praktek berikut adalah contoh code nya untuk join di mongodb

db.books.aggregate([
{
    $lookup:
     {
       from: 'category', // collection yang akan kita join
       localField: 'id_kategori', // id category di simpan di kolom books
       foreignField: '_id', // id di collection category
       as: 'kategori' // alias result column
     }
}    
])

Sehingga resultnya akan menjadi seperti ini

result skenario pertama

Mungkin akan timbul pertanyaan bagaimana supaya result nya saya hanya ingin nama kategori nya saja berikut adalah contoh dari skenario selanjutnya,

db.books.aggregate([
    {
        $lookup:
        {
            from: 'category',
            localField: 'id_kategori',
            foreignField: '_id',
            as: 'kategori'
        },
    }, {
        $project: {
            "book_name": "$name",
            "book_category_name": "$kategori.name"
        }
    }
])
result skenario kedua

Hasil result dari skenario kita hanya mengambil beberapa kolom saja dan bsa mendefinisikan output yang akan kita kirim apa saja menggunakan $project mungkin akan timbul pertanyaan lagi saya ingin output dari kategorinya bukan berupa array, berikut adalah contoh code skenario terakhir

db.books.aggregate([
    {
        $lookup:
        {
            from: 'category',
            localField: 'id_kategori',
            foreignField: '_id',
            as: 'kategori'
        },
    },
    { $unwind: "$kategori" }, {
        $project: {
            "book_name": "$name",
            "book_category_name": "$kategori.name"
        }
    }
])
result skenario ketiga

Yos sampain disini praktek join di mongodb sudah selesai mungkin segitu yang bisa saya sampaikan pada tulisan kali ini semoga bermanfaat bagi teman-teman, jika ada yang tidak mengerti, ada kesalahan dalam penulisan dan ada yang ingin ditanyakan atau di tambahkan bisa tulis dikolom komentar terimakasih.

Posting Komentar

3 Komentar

  1. Online Casino Site: Online Casino & Slots UK | Choegocasino
    Play our fantastic range of online casino games including slots, blackjack, roulette and 메리트카지노총판 more with 카지노사이트 Choegocasino™. Enjoy our great selection of exciting games! 1xbet

    BalasHapus
  2. terima kasih informasinya sangat berguna bagi saya!
    Demo Slot Pragmatic

    BalasHapus
  3. terima kasih informasinya sangat berguna bagi saya

    BalasHapus