Search by

    Terakhir diperbaharui: Mar 2, 2021

    MongoDB

    Jika MySQL adalah yang paling populer di dunia Relational Database, maka di dunia Non-relational Database ada MongoDB.

    Hasil survey Stack Overflow tahun 2020 untuk kategori Most Popular Database.

    mongodb popularity

    MongoDB termasuk tipe Non-relational database dimana data disimpan dalam bentuk BSON document.

    BSON adalah versi binary dari JSON.

    NoSQL vs SQL

    Sebelum kita lanjutkan kita perlu membahas beberapa perbedaan penting antara NoSQL dengan SQL dengan membandingkan MySQL dengan MongoDB.

    Developer yang sudah terbiasa dengan konsep SQL database mungkin akan berusaha menerapkan konsep SQL ketika menggunakan NoSQL database.

    Padahal konsep keduanya bisa dibilang sangat berbeda.

    Bentuk data

    MySQL

    Pada MySQL sebuah database adalah gabungan dari satu atau banyak table.

    Data harus disimpan dalam bentuk table, sebagai contoh kita memiliki table bernama dino berisikan profil dari setiap dinosaurus.

    mysql table example

    Jika kita menambah data dinosaurus baru maka kita harus menyesuaikan format data tersebut dengan kolom yang tersedia. Jika sebagian data kosong maka value dari kolom tersebut adalah null.

    mysql table example 2

    MongoDB

    Sebuah database pada MongoDB adalah kumpulan dari satu atau banyak collections.

    Collection mirip dengan table SQL.

    Sebagai contoh, kita memiliki sebuah collection yang berisikan data yang sama dengan table dino di atas.

    mongodb example

    Data baru dapat ditambahkan ke dalam collection dalam format yang tidak beraturan/terstruktur dan tidak harus sama dengan data yang sudah ada.

    mongodb example 2

    Read Operation

    MySQL

    Operasi membaca data atau Read Operation pada database MySQL bisa dibilang operasi yang cukup murah dan mudah (resource yang digunakan tidak terlalu besar), hal ini dikarenakan sejak dari awal data harus dinormalisasi terlebih dahulu sebelum ditambahkan ke database.

    Yang dimaksud normalisasi adalah mengatur kolom pada tabel agar tidak terjadi data redundancy (duplikat data terjadi tanpa ada tujuan).

    Operasi Read pada MySQL bisa menjadi ‘mahal’ jika harus melakukan operasi join banyak tabel. Meskipun dengan menerapkan beberapa teknik optimasi hal ini bisa dihindari.

    MongoDB

    Kebalikan dari MySQL, operasi Read pada MongoDB bisa jadi mahal karena bentuk data yang ditambahkan bisa jadi tidak beraturan dari awal.

    Untuk mendesain model data untuk NoSQL database kita fokus pada query pattern dan bentuk data yang ingin didapatkan. Hal ini berbeda dengan MySQL dimana kita fokus kepada struktur dan normalisasi data.

    Kita bisa menggunakan kata kunci berikut untuk mempermudah kita dalam mendesain model data pada database.

    Untuk SQL database, Dalam bentuk seperti apa data akan disimpan?.

    Untuk NoSQL database, Dalam bentuk seperti apa data akan dibaca?.

    Duplikasi data pada NoSQL adalah sesuatu yang normal.

    Scalability

    Meningkatkan skalabilitas dari SQL database lebih mudah dilakukan secara vertical, yang berarti peningkatan kemampuan dari SQL database dilakukan dengan cara meningkatkan spesifikasi mesin/server/komputer.

    Sedangkan skalabilitas dari NoSQL database lebih mudah dilakukan secara horizontal, meningkatkan kemampuan dari NoSQL database dapat dilakukan dengan cara menambah jumlah dari mesin/server/komputer.


    Pada prakteknya kita akan menemukan banyak aplikasi menggunakan kombinasi antara SQL dan NoSQL database. Karena dengan begitu kita bisa mengumpulkan kelebihan dari masing-masing database.

    Selanjutnya kita akan bahas instalasi MongoDB dan Operasi Dasar MongoDB.

    Install

    Langkah instalasi berikut ini adalah untuk OS Linux berbasis debian(Ubuntu, Mint), untuk OS Windows silahkan download installernya disini.

    1. Import public key

    Jalankan perintah berikut ini dari terminal

    1$ wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -

    2. Tambahkan Sourceslist

    Ubuntu 20.0

    1$ echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list

    Ubuntu 18.04

    1echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list

    3. Update package list

    1$ sudo apt-get update

    4. Install MongoDB

    1$ sudo apt-get install -y mongodb-org

    5. Start MongoDB

    1$ sudo systemctl start mongod

    6. Periksa jika MongoDB server berjalan dengan baik

    1$ sudo systemctl start mongod

    Untuk dapat berinteraksi dengan MongoDB server kita bisa gunakan MongoDB shell.

    Buka terminal dan eksekusi perintah berikut:

    1$ mongo

    Operasi Dasar MongoDB

    Operasi dasar pada MongoDB mirip dengan operasi dasar pada SQL database pada umumnya.

    Database

    Membuat database

    Perintah:

    1use DATABASE_NAME

    Perintah di atas akan membuat sebuah database baru jika tidak ditemukan database dengan nama yang sama di server.

    Jika sudah ada database dengan nama yang sama, maka perintah tersebut akan menampilkan database yang sudah ada.

    Menghapus database

    Method:

    1use DATABASE_NAME
    2db.dropDatabase()

    Pilih database yang ingin dihapus kemudian eksekusi perintah db.dropDatabase() untuk menghapusnya.

    Collection

    Membuat collection baru

    Method:

    1db.createCollection(name, options)

    options disini adalah parameter yang bisa kita tambahkan dalam membuat sebuah collection dan bersifat optional.

    1db.createCollection( <name>,
    2 {
    3 capped: <boolean>,
    4 autoIndexId: <boolean>,
    5 size: <number>,
    6 max: <number>,
    7 storageEngine: <document>,
    8 validator: <document>,
    9 validationLevel: <string>,
    10 validationAction: <string>,
    11 indexOptionDefaults: <document>,
    12 viewOn: <string>, // Added in MongoDB 3.4
    13 pipeline: <pipeline>, // Added in MongoDB 3.4
    14 collation: <document>, // Added in MongoDB 3.4
    15 writeConcern: <document>
    16 }
    17)

    Penjelasan dari setiap parameter bisa dilihat disini

    Contoh:

    create collection

    Perbandingan dengan MySQL

    • Table terdiri dari row & column, sedangkan collection terdiri dari field & value
    • Tidak seperti MySQL dimana kita harus menentukan nama dari column dan tipe datanya, pada MongoDB kita tidak mendefinisikan setiap field dari collection. Nama dari collection saja sudah cukup

    Menghapus collection

    Method:

    1db.DATABASE_NAME.drop()

    Contoh:

    drop collection

    CRUD (Create, Read, Update, Delete) Operation

    Create

    Menambahkan data(selanjutnya kita sebut document) ke dalam collection.

    MongoDB menyediakan dua metode untuk menambahkan document, yaitu:

    • db.collection.insertOne(document), untuk menambahkan document tunggal/single
    • db.collection.insertMany(document), untuk menambahkan banyak document

    Contoh db.collection.insertOne():

    insert one

    insert one code

    Contoh db.collection.insertMany():

    insert many

    Perbandingan dengan MySQL

    • MongoDB secara otomatis akan membuat sebuah ObjectID untuk setiap document yang kita masukan untuk membedakan antara satu document dengan document yang lain. ObjectID ini mirip dengan primary key pada MySQL.
    • Pada contoh db.collection.insertMany(), bentuk document satu dengan yang lain tidak harus sama dan bisa sangat berbeda.

    Field pada document pertama adalah name & color, sedangkan document kedua adalah name, color dan height, hal ini tidak akan menambahkan field height ke document pertama.

    Read

    Untuk membaca document pada collection kita gunakan db.collection.find(filter).

    Contoh:

    Menampilkan semua document.

    find

    Menampilkan dengan filter.

    find filter

    find filter code

    Perbandingan dengan MySQL

    • Bentuk document bisa tidak beraturan

    Update

    Mengubah document.

    Ada 3 Method:

    • db.collection.updateOne(filter, update), ubah satu document
    • db.collection.updateMany(filter, update), ubah banyak document sekaligus sesuai filter
    • db.collection.replaceOne(filter, update), ganti satu document dengan document yang baru sesuai filter

    Contoh db.collection.updateOne():

    update one

    update one code

    Delete

    Menghapus document.

    Ada 2 Method:

    • db.collection.deleteOne(filter), hapus satu document
    • db.collection.deleteMany(filter), hapus banyak document sekaligus sesuai filter

    delete one

    Aggregation

    Konsep join pada SQL database tidak akan kita temukan pada NoSQL database seperti MongoDB, karena pada asalnya NoSQL database tidak didesain untuk menyimpan data yang terstruktur.

    Lalu bagaimana jika kita ingin query document dari beberapa collection dan ditampilkan dalam satu tampilan seperti pada MySQL ?

    Seperti yang dijelaskan sebelumnya, jika kita menggunakan NoSQL database maka kita fokus pada access pattern dan bagaimana bentuk data yang ingin kita dapatkan/baca.

    Dengan menggunakan access pattern kita bisa mendapatkan berbagai bentuk data hanya dengan query satu collection.

    Dan sangat mungkin antara satu collection dengan collection yang lain tidak terdapat relasi, sehingga kita tidak memerlukan konsep seperti join pada sql database.

    MongoDB memiliki konsep aggregation yang bisa digunakan sebagai pengganti join namun terbatas untuk document, bukan collection.

    Aggregation adalah sebuah operasi dimana value dari berbagai document di kelompokan menjadi satu untuk selanjutnya diproses agar mendapatkan hasil yang diinginkan.

    Tidak semua NoSQL database memiliki konsep aggregation, setiap NoSQL database memiliki pendekatannya masing-masing. Sebagai contoh DynamoDB tidak support aggregation, tetapi DynamoDB memiliki Global Secondary Index dan Local Secondary Index yang bisa dimanfaatkan sebagai ganti aggregation.

    Contoh Aggregation pada MongoDB:

    1db.dinoProfile.aggregate([
    2 { $match: { color: "red" } },
    3 { $group: { _id: "$dinoId", total: { $sum: "$height" } } }
    4])

    Penjelasan:

    Stage 1 : cari semua dino pada collection dinoProfile yang memiliki warna merah dengan operator $match.

    Stage 2: kumpulkan hasil pencarian dalam satu grup sesuai field dinoId menggunakan operator $group untuk kemudian dihitung total tinggi dari dino menggunakan operator $sum.