Operasi CRUD Database MongoDB dengan Python (Bagian 1)

Tutorial MongoDB dengan Python PyMongo

MongoDB adalah sistem manajemen basis data NoSQL yang sangat populer untuk menyimpan dan mengelola data dengan skema semi-struktural. Salah satu keunggulan mongoDB adalah kemampuannya dalam menyimpan data semi-struktural atau data dengan skema yang dapat berubah seiring waktu. Ini berarti kita tidak perlu mendefinisikan skema tabel terlebih dahulu seperti pada sistem basis data relasional tradisional. Sebagai gantinya, kita dapat menyimpan dokumen dalam format JSON yang dapat berbeda baik struktur dan isinya di dalam suatu koleksi mongoDB.

Fokus dari tulisan ini adalah bagaimana melakukan operasi CRUD ke koleksi mongoDB menggunakan python. Tulisan ini merupakan bagian pertama dari dua bagian. Pada bagian ini pembahasan mencakup penyiapan kontainer mongoDB, pembuatan (create) dokumen dan pembacaan (read) dokumen menggunakan python. Adapun pada bagian kedua topik bahasan akan mencakup modifikasi dokumen (update), penghapusan dokumen (delete) serta agregasi data dan pipeline.

Mengawali bagian pertama ini, kita akan mulai dengan penyiapan server mongoDB.

Instalasi Kontainer MongoDB

Langkah pertama yang harus dilakukan adalah menyiapkan server MongoDB. Untuk alasan kemudahan pengaturan server, pada tutorial ini kita akan menggunakan kontainer mongoDB dengan docker. Namun silahkan saja jika ingin melakukan instalasi mongoDB secara langsung pada komputer atau bahkan menggunakan layanan remote server seperti MongoDB Atlas.

Jika menggunakan Microsoft Windows, kita dapat menginstal kontainer mongoDB melalui Docker Desktop. Berikut tahapan instalasi yang perlu dilakukan:

  • Buka Docker Desktop (jika belum ada, silahkan unduh di sini Docker Desktop), dan pada kotak pencarian ketik mongo sampai muncul pilihan image terkait mongoDB
  • Pilih image mongo (official image), selanjutnya pilih versi yang ingin digunakan misalnya latest lalu klik Run
  • Pada kotak dialog Run a new container, masukkan nama kontainer misalnya tutorial_mongo_python. Masukkan juga port yang digunakan. Bagian ini mengatur port pada komputer lokal yang akan menjadi port forwarded bagi kontainer mongoDB. Port dapat diisikan berapa saja, dalam contoh ini digunakan port 27017 yaitu port yang sama dengan port default mongoDB pada kontainer. Artinya saat kita mengakses port 27017 pada komputer lokal, maka akan diteruskan ke port 27017 pada kontainer mongoDB. Lanjutkan dengan klik Run dan tunggu sampai proses selesai.
  • Setelah selesai, buka tab Containers dan pastikan status kontainer Running. Jika belum, maka jalankan kontainer dengan klik tombol segitiga (start) pada kolom Actions.

Jika langkah-langkah di atas sudah berjalan dengan benar, maka kontainer mongoDB sudah terpasang dan siap digunakan untuk operasi CRUD dengan python.

Ekstensi MongoDB VS Code

(Bagian ini adalah opsional dan dapat dilewati)

Pada tutorial ini penulisan kode python akan menggunakan editor Visual Studio Code. Tentu anda dapat menggunakan kode editor apapun yang diinginkan, jadi silahkan gunakan kode editor pilihan anda.

Visual Studio Code memiliki ekstensi mongoDB for VS Code yang memungkinkan kita melihat database, membuka koleksi serta dokumen yang tersimpan pada server mongoDB. Jika dirasa perlu, silahkan menginstal ekstensi ini pada VS Code anda. Proses instalasi dapat dilakukan dengan mudah dengan mengikuti langkah berikut ini:

  • Buka tab Extension dan cari ekstensi MongoDB for VS Code kemudian klik Install
  • Jika instalasi berhasil, akan muncul tab baru dengan icon , klik tab tersebut kemudian atur koneksi dengan klik tombol Connect. Masukkan connection string dengan format mongodb://url_server:port misalnya mongodb://localhost:27017.
  • Jika koneksi berhasil dibuat, pada panel bagian kiri akan tampil daftar koneksi dengan status connected. Pada bagian ini kita dapat melihat daftar database, koleksi serta dokumen yang terdapat pada server tersebut.

Interaksi MongoDB dengan python

Untuk mengakses database mongoDB menggunakan python, kita memerlukan pustaka tambahan yaitu pymongo. Pustaka dapat dipasang menggunakan pip seperti berikut:

Instalasi pymongo

Selanjutnya, untuk membuka koneksi ke kontainer mongoDB adalah dengan menggunakan fungsi MongoClient. Pada fungsi ini tentukan alamat dan port dari server yang digunakan misalkan mongodb://localhost:27017/. Setelah terhubung, gunakan fungsi Client untuk membuka atau membuat database. Jika nama yang diberikan tidak ada, maka secara otomatis database akan dibuat menggunakan nama yang diberikan. Jika sudah terhubung dengan database, kita dapat mengakses koleksi di dalamnya menggunakan namanya. Sama seperti sebelumnya, ketika nama koleksi yang diberikan tidak ada dalam database, maka otomatis akan dibuat koleksi baru dengan nama tersebut. Pada contoh ini nama database yang digunakan adalah pokemon_db dan nama koleksinya adalah pokemon_info.

Untuk tahap awal ini, kita dapat mengecek jumlah dokumen pada koleksi pokemon_info menggunakan metode count_documents. Karena database dan koleksi baru dibuat, maka belum ada dokumen apapun di dalamnya

Koneksi ke mongoDB

Membuat Dokumen

Proses create dokumen adalah proses untuk menambahkan dokumen baru pada suatu koleksi. Terdapat dua cara yang dapat digunakan yaitu dengan metode insert_one dan insert_many. Sesuai namanya insert_one digunakan untuk menambah 1 dokumen sedangkan insert_many digunakan untuk menambah beberapa dokumen sekaligus ke dalam suatu koleksi.

insert_one

Dokumen yang akan di-insert perlu dibuat dalam bentuk dictionary yaitu struktur data berupa pasangan key-value. Pada contoh berikut, kita membuat objek pikachu dengan tiga key/field yaitu name, type dan species. Ketika kita menggunakan metode insert_one, hasil insert juga dapat disimpan pada variabel tertentu, variabel tersebut akan memiliki informasi terkait status insert, salah satunya adalah "_id" atau status jika terjadi kegagalan.

Sebagai catatan, ketika melakukan insert dokumen tanpa disertakan field "_id", maka mongoDB akan otomatis membangkitkan id unik pada dokumen tersebut (mirip seperti primary key pada database tabular). Artinya jika contoh kode di bawah ini dijalankan berulang kali, maka akan selalu diinsert dokumen baru dengan "_id" yang berbeda namun isian lainnya sama. Oleh karena itu, jika ingin memastikan data benar-benar unik dapat menambahkan field "_id" pada dokumen yang akan di-insert.

Insert satu dokumen

insert_many

Metode insert_many digunakan untuk menambah beberapa dokumen sekaligus pada koleksi. Semua dokumen yang akan ditambah perlu disimpan dalam bentuk list. Pada contoh dibawah ini terdapat objek list pokemon_docs yang berisi 3 dokumen dan masing-masing dokumen terdiri dari beberapa field. Setiap dokumen juga memiliki field "_id", dengan mencantumkan key "_id" ini, mongoDB akan menggunakannya sebagai identitas unik.

Insert banyak dokumen

Jika kita menginstal ekstensi mongoDB di VS Code, hasil insert yang sebelumnya sudah dilakukan dapat dilihat melalui tab mongoDB. Untuk memastikan informasi terbaru sudah tampil, klik kanan pada koleksi dan klik menu refresh.

Pada panel bagian kanan dapat dilihat 4 dokumen yang sudah ditambahkan. Termasuk 1 dokumen dengan "_id" yang digenerate oleh mongoDB dan 3 dokumen lainnya dengan "_id" yang sudah ditentukan. Setiap dokmen juga dapat di-klik untuk melihat isian lengkapnya

Pada bagian selanjutnya, kita akan menggunakan python untuk membaca koleksi pada database mongoDB. Agar contoh yang disajikan lebih lengkap, kita akan memasukkan sejumlah data terlebih dahulu. Silahkan download file JSON berikut (pokedex_1st_gen.json), simpan pada lokasi yang sama dengan file python yang digunakan. File ini berisi informasi dari 151 pokemon generasi pertama. Data-data tersebut akan kita gunakan untuk bagian-bagian selanjutnya.

Sebelum menambahkan dokumen ke dalam koleksi pokemon_info, mari kita hapus semua dokumen sebelumnya (atau dapat juga dengan membuat koleksi baru).

Menghapus seluruh dokumen

insert_many (file JSON)

File json yang akan digunakan berisi data 151 pokemon generasi 1 dan memuai informasi serta statistik dari pokemon-pokemon tersebut. Beberapa pokemon memiliki field "successor" dan "predecessor", beberapa hanyak memiliki salah satu field tersebut dan beberapa tidak memiliki keduanya. Untuk field-field yang lain memiliki struktur yang sama untuk setiap dokumen pokemon.

Untuk membuka dokumen JSON gunakan pustaka bawaan python yaitu json. Kita juga menambahkan pustaka pprint agar dapat menampilkan output yang lebih rapi pada objek list dan dict.

Berikut ini kode untuk membaca dokumen JSON serta proses insert dokumen ke dalam koleksi 'pokemon_info':

Insert dokumen dari file json

Membaca Dokumen

Koleksi dokumen pada mongoDB dapat dibaca menggunakan metode find_one dan find. Metode find_one digunakan untuk mendapatkan 1 dokumen dari dalam koleksi, sementara metode find berfungsi lebih luas dan dapat mengembalikan banyak elemen sekaligus berdasarkan kriteria pencarian. Penjelasan kedua metode ini dijelaskan lebih detail pada bagian berikut ini.

find_one

Metode find_one digunakan untuk mencari 1 dokumen dari koleksi. Jika dokumen yang cocok dengan kriteria pencarian lebih dari 1, maka tetap hanya1 saja yang dikirimkan sebagai output. Adapun output yang dikirimkan berupa objek dengan tipe dict.

Secara default, metode find_one akan mengambil semua nilai field yang ada pada dokumen, namun kita dapat menambahkan argumen kedua pada metode tersebut untuk menentukan field mana saja yang akan diambil atau tidak ("_id" akan selalu dikembalikan walaupun tidak ditulis secara eksplisit, kecuali jika diset "_id": 0).

Di bawah ini diberikan 4 contoh penggunaan metode find_one untuk pencarian dokumen. Masing-masing contoh menunjukkan beberapa cara pemanggilan dengan kriteria yang berbeda.

  • Contoh 1: mencari dokumen dengan kriteria “name": "Pikachu", pencarian ini mendapatkan 1 dokumen yang cocok, selanjutnya seluruh field pada dokumen akan disimpan pada variabel result_1.
  • Contoh 2: sama dengan contoh 1, namun membatasi field yang diambil yaitu name dan type saja.
  • Contoh 3: sama dengan contoh 1, namun membatasi field yang diambil yaitu selain type, ability dan stats.
  • Contoh 4: mencari dokumen dengan kriteria "spesies": "Flame". Pada koleksi ini seharusnya terdapat beberapa dokumen yang memenuhi, namun metode find_one hanya akan mengembalikan 1 dokumen saja.

Contoh metode find_one

find

Metode find dapat digunakan untuk mendapatkan banyak dokumen sekaligus sesuai dengan kriteria yang diberikan. Output yang dihasilkan dari metode find berupa objek kursor dimana untuk mengakses elemen-elemennya secara berurutan dapat dilakukan menggunakan iterasi. Namun, objek tersebut juga dapat kita konversi ke dalam list jika akan digunakan untuk lebih lanjut.

Berikut ini disajikan dua contoh penggunaan metode find untuk mencari dokumen pada koleksi dengan kriteria tertentu.

  • Contoh pertama : menggunakan metode find untuk mencari dokumen dengan kriteria "species": "Flame", output yang diperoleh langsung kita konversi ke dalam bentuk list dan disimpan pada variabel "flame_pokemon". Dengan bantuan fungsi pprint kita dapat menampilkan output yang lebih rapi. Output menunjukkan terdapat 4 dokumen yang sesuai dengan kriteria ini.
  • Contoh kedua : mencari dokumen dengan kriteria "stats.attack": 100. Perhatikan di sini, bahwa "attack" merupakan field yang berada di dalam field "stats". Oleh karena itu, untuk mengaksesnya field tersebut kita gunakan format "field_1.field_2". Cara yang sama juga dapat diterapkan untuk field bersarang yang lebih dalam lagi. Sama seperti sebelumnya, output dikonversi menjadi bentuk list dan disimpan pada variabel attack_100.

Contoh metode find

Operator Perbandingan

Dalam proses pencarian dokumen, kita dapat mengatur kriteria tertentu dengan lebih spesifik menggunakan operator perbandingan. MongoDB memiliki beberapa operator yaitu $eq, $ne, $gt, $gte, $lt, $lte, $in, $nin dan $all. Dua operator pertama, yaitu $eq dan $ne digunakan untuk membandingkan kesamaan dan ketidaksamaan dari suatu field. Operator berikutnya yaitu $gt, $gte, $lt, dan $lte digunakan untuk perbandingan nilai suatu field apakah lebih besar atau lebih kecil dari nilai tertentu. Tiga operator terakhir yaitu $in, $nin dan $all digunakan untuk mengecek apakah suatu field memiliki nilai diantara sekumpulan nilai yang diberikan.

>>> $eq dan $ne

Operator $eq (equal) dan $ne (not equal) digunakan untuk mengecek kesamaan atau ketidaksamaan nilai pada field tertentu. $eq digunakan untuk mencari dokumen dengan nilai field tertentu. Sementara itu, operator $ne dapat digunakan untuk mencari dokumen dengan kondisi tidak sama dengan nilai tertentu. Khusus untuk operator $eq, sebenarnya sama dengan yang sudah kita lakukan pada bagian sebelumnya yaitu langsung menggunakan {"nama_field": nilai}. Jadi operator $eq ini dapat dijadikan sebagai alternatif.

Contoh operator $eq dan $ne

>>> $gt, $gte, $lt, dan $lte

Empat operator ini digunakan untuk membandingkan besaran nilai suatu field terhadap nilai tertentu. keyword yang digunakan sudah cukup menjelaskan perbedaan masing-masing operator yaitu: $gt (greater than), $gte (greater than or equal), $lt (less than) dan $lte (less than or equal).

Contoh operator $gt, $gte, $lt dan $lte

>>> $in, $nin, dan $all

Operator $in, $nin dan $all digunakan untuk memeriksa apakah nilai pada suatu field cocok atau tidak cocok dengan sekumpulan nilai tertentu. Pada operator $in nilai field harus cocok dengan setidaknya salah satu kumpulan item tersebut. Sebaliknnya, pada operator $nin nilai field harus berbeda dengan setiap item yang diberikan. Adapun untuk operator $all, nilai pada field harus cocok dengan semua item yang diberikan.

Contoh operator $in, $nin, dan $all

Operator Logika

Operator logika berfungsi untuk menggabungkan beberapa kriteria sekaligus. MongoDB menyediakan 4 operator logika yang dapat digunakan dalam pemeriksaan kriteria pencarian, yaitu:

$and: mengabungkan 2 atau lebih kriteria dan ekspresi akan bernilai True jika semua kriteria bernilai True. (tanpa menulis secara eksplisit operator $and pencarian dengan beberapa kriteria secara otomatis akan dievaluasi menggunakan and, seperti beberapa contoh yang telah diberikan pada contoh-contoh sebelumnya)

$or: menggabungkan 2 atau lebih kriteria dan ekspresi akan bernilai True jika setidaknya satu kriteria bernilai True

$not: mengembalikan negasi (kebalikan nilai) dari kriteria yang diberikan. Jika kriteria bernilai True maka operator $not akan menghasilkan nilai False dan sebaliknya

$nor: mengembalikan negasi dari operasi $or atau hanya akan memberikan nilai True jika semua ekspresi bernilai False

Contoh operator $and, $or, dan $not

Regex dan Ekspresi

Pencarian dokumen pada mongoDB juga dapat dibuat dengan regular expression (regex). Untuk melakukan pencarian berdasarkan regex kita dapat menggunakan operator $regex. Selain itu, terdapat satu operator lainnya yang juga dapat dimanfaatkan dalam penentuan kriteria pencarian yaitu $expr.

Pada setiap contoh yang sudah dibuat, semua kriteria berupa nilai konstanta seperti "stats.attack" > 100 atau "species" = "Flame" dan sebagainya. Operator $expr memungkinkan kita melakukan pencarian dengan cara membandingkan nilai 1 field dan field lainnya. Sebagai contoh, kita dapat mengambil dokumen dimana nilai field "stats.attack" sama dengan nilai field "stats.defense" ataupun field lainnya.

Contoh operator $regex dan $expr

Ringkasan

Pada bagian pertama ini kita sudah menyelesaikan topik penyiapan database mongoDB pada docker serta operasi pembuatan dokumen (create) dan pembacaan dokumen (read) mongoDB melalui python. Terdapat setidaknya 4 metode yang dapat digunakan untuk melakukan operasi-operasi tersebut meliputi metode insert_one, insert_many, find_one, dan find. Selain itu, terdapat pula berbagai operator yang memungkinkan kita mengatur kriteria pengambilan dokumen secara lebih spesifik.

Pada bagian kedua topik akan dilanjutkan dengan pembahasan metode update dan delete dokumen serta agregasi dan penggunaan pipeline untuk melakukan operasi yang lebih kompleks.

Selanjutnya: Operasi CRUD Database MongoDB dengan Python (Bagian 2)

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *

Daftar Isi