Monday, September 23, 2013

Android Dev. For Dummy I: Intent


Satu hal yang saya syukuri adalah saya "pembelajar" yang baik, yahh walaupun saya tidak dapat melakukan segala sesuatunya dengan baik tapi saya sangat baik ketika mempelajari sesuatu, terutama dalam bidang pekerjaan saya, computer programming. Hmmm bentar2, saya kok ingat pepatah "kurang tepat disebut sebagai pembelajar yang baik, karena hanya ada pembelajar yang sungguh-sungguh". Enngggg... yah udah lah saya dak mau mendebat pepatah ini, tapi memang saya termasuk orang yang sangat sungguh-sunggu belajar untuk dapat pemahaman. So what?? yaa ini hanya sekedar pembuka saja, kurang #greget kalo to the point, dan mungkin saja ada someone yang peduli tentang saya heuheuheu. 

Sebenarnya saya ingin nulis tentang pemahaman (hasil semedi) saya tentang android programming selama ini. Saya sebut "pemahaman", bukan "pengetahuan" karena memang untuk mendapat hasil yang baik kita harus "paham", bukan hanya sekedar "tahu" #supeerrr.  

Semua hal, apapun itu akan kelihatan rumit ketika baru pertama kali mempelajarinya, right?? istilah baru, teknologi baru, konsep pemrograman baru dan baru-baru lainnya. Tapi ada beberapa saran bagi para pembelajar nih, beberapa saran ini juga saya lakukan untuk belajar pemrograman komputer. Yang pertama, susun beberapa prioritas utama yang "harusnya" dipelajari pertama kali. belajar terus sampai paham dari tiga saja prioritas pertama tadi. Kedua, Carik dan pahami kenapa "sesuatu" itu dinamakan atau diistilahkan "A" atau "B", coz si pembuat "sesuatu" itu pastinya juga mikir gimana caranya ngasih tahu orang dengan hanya pakek "nama". Dan yang ketiga, buat penjelasan yang sangat2 sederhana dari kata2 yang sederhana dan dengan bahasa sendiri. yah ini untuk nyimpulkan aja apa kita benar2 paham atau tidak. kalo kita tidak dapat mengartikan secara sederhana, itu artinya kita menganut paham vickisme, dan itu dak baek untuk jiwa dan raga heuheuheu. Kok banyak banget yah pembukanya, padahal pengen nulis tentang android #hadee. Okelah kita masuk ke intinya kalo gitu.      

Tiga pokok bahasan jadi prioritas pertama untuk mempelajari pemrograman android, yaitu intent, activity dan view - ini menurutku sih, so kalo emang ada yang beda, yaah dak usahlah ngajak berantem :)_. Pun dengan memahami ketiga bahasan ini, kita masih belom bisa membuat aplikasi dengan hasil yang bagus, tapi aplikasi android apapun rasanya, apapun bentuknya pasti tidak akan melupakan ketiga bahasan ini. So, mari kita mulai:

Apa itu intent?

Pernah denger kata "the power of intention" atau mungkin sebuah quote "A good traveler has no fixed plans, and is not intent on arriving". Apa arti intent itu disini, dan apa yang dimaksud intent pada pemrograman android platform. Hal pertama yang biasa saya lakukan adalah mencari tahu istilah dari sisi bahasa/arti katanya.

Saya lebih suka mengartikan intent dalam pemrograman android ini sebagai "maksud" | "purpose". Maksud saya seperti "ini", saya ingin seperti "itu", yah hanya sebatas "maksud" dan "ingin". Contohnya seperti ini: "Saya memiliki vCard contact, dan saya ingin melihatnya", contoh lain "Saya ingin membuka dan melihat alamat URL ini", contoh lain lagi "Saya ingin melihat gambar ini, pada aplikasi Image Viewer ini". Sampai disini Intent ini tidak ada gunanya, dia "useless", yaaah sama seperti kita jika hanya ingin ini ingin itu banyak sekali, yaah pasti sulit untuk "move on"-nya heuheuheu. Makanya kemudian ada yang namanya "activity", untuk mewujudkan apa kita punya intent :)_. Nah kan dari sini udah kelihatan hubungannya.

Saya coba googling untuk mengetahui beberapa definisi intent dari beberapa temen2 developer dan saya pikir beberapa kurang tepat untuk menjelaskan apa itu intent. Contoh definisinya seperti ini : 

Kalau pendapat saya, intent itu adalah sebuah object yang merupkan Kunci  untuk berkomunikasi dengan activity lainnya.

Dan ada juga definisi menurut paham #vickisme

Intent adalah pesan asynchronous yang memungkinkan aplikasi untuk memberikan request secara fungsionalitas dari komponen yang berbeda di sitem android, misalnya Service, broadcast receiver atau Activity.

Dalam prakteknya sih, intent bisa digunakan melempar data dari satu activity ke activity lainnya. Sebenarnya sih intent bukan untuk "komunikasi", dia hanya sebatas menyatakan "maksud". Sama seperti #KatakanCinta -lah, kira-kira begitu :)).

Intent terbagi menjadi dua, implisit dan eksplisit. Dalam arti bahasa saja (tidak pake lihat dokumentasi), kita sudah mengetahui apa itu "maksud" yang implisit dan apa "maksud" eksplisit. Contohnya gini. intent pertama, "Saya ingin mengirimkan sebuah pesan ke si Eneng". Intent kedua "Saya ingin mengirimkan pesan lewat BBM ke si Eneng". Nah coba lihat kedua intent itu, apa perbedaannya?_. Perbedaannya ada pada "activity" apa pesan itu harus dilewatkan. Yang pertama tidak menyebutkan "activity" apa, sedangkan yang kedua menyebutkan "activity" apa yang dia maksud. Nah kelihatan kan apa yang harus saya buat dengan intent. Yang pertama disebut implisit intent dan kedua disebut eksplisit intent. Berikut penjelasan teknis yang saya copas saja dari dokumentasinya, pasang kacamata pengaman yah, coz kata2nya akan sedikit banyak menyilaukan :))

There are two primary forms of intents you will use: 
Explicit Intents have specified a component (via setComponent(ComponentName) or setClass(Context, Class)), which provides the exact class to be run. Often these will not include any other information, simply being a way for an application to launch various internal activities it has as the user interacts with the application. 
Implicit Intents have not specified a component; instead, they must include enough information for the system to determine which of the available components is best to run for that intent.

Berikut contoh kodingan implisit intent dan eksplisit intent.

// Implisit intent
String url = "http://www.goocode.blogspot.com";
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));

// Eksplisit intent
Intent i = new Intent(this, ActivityTwo.class);
i.putExtra("Value1", "This value one for ActivityTwo ");
i.putExtra("Value2", "This value two ActivityTwo"); 

Yah kira-kira sama saja apa yang saya tulis dengan bahasa teknis dokumentasi kayak yang diatas :)_. Untuk pembahasan lebih lanjut mengenai intent ini, saya tambahi nanti dibagian Activity. Tapi udahan dulu yah hehehe. Udah telat nih, janjian mau ngopi dan nonton bareng #IndonesiaPastiMenanggg...

#to be continued...

Sunday, September 22, 2013

MongoDB Part 3: Autosharding


Pada bagian tiga ini, saya akan coba menjelaskan tentang teknik sharding di MongoDB. Tapi sebelum itu, jika Anda belum tahu mengenai database ini, Anda dapat membaca dulu bagian I dan bagian II di Bisakomputer.

Sharding ini mengacu pada pembagian data ke beberapa komputer dengan porsi yang berbeda. Istilah lainnya mengenai sharding sama dengan partioning. Setiap penyimpanan data baik itu relational database maupun database NoSQL, akan selalu menyediakan fitur partioning data, ini beralasan karena dengan teknik ini dapat meningkatkan performanceavailability dan manageability data store.

Seperti yang saya katakan diawal artikel (bagian I), arsitektur MongoDB telah dirancang untuk kemudahan penerapan teknik ini. Sharding mongodb lebih dikenal dengan autosharding, ini karena beberapa urusan administrative telah otomatis dilakukan oleh mongodb, seperti menangani pembagian data ke beberapa cluster dan mengotomatisasi rebalancing data.

Arsitektur

Konsep dasar dari sharding adalah memisahkan collection ke dalam bagian-bagian kecil yang disebut chunksChunks ini kemudian didistribusikan ke server cluster yang disebut sebagai shard. Dengan begini masing-masing shard bertanggung jawab terhadap subset data yang disimpan. Setiap shard dapat direpresentasikan sebagai mesin dengan koneksi ke satu atau lebih service mongo (mongod). Dari sini tentunya kita berpikir bahwa akan ada lebih dari satu service mongod yang dibuat, sehingga pertanyaannya adalah client harus terkoneksi ke mana untuk mengambil dan store data?.

Dalam mengembangkan sebuah aplikasi, kita dapat men-setup aplikasi untuk langsung koneksi ke service MongoDB. Namun, dengan melakukan sharding, koneksi tidak secara langsung kepada tiap service. Menghubungkan aplikasi dengan shards cluster, bisa dilakukan dengan proses routing yang dinamakan dengan mongos (Gambar 2).

Gambar 1
men-setup aplikasi untuk langsung koneksi ke service MongoDB
Gambar 2
Menghubungkan aplikasi dengan shards cluster

mongos process dapat juga dikatakan sebagai abstraksi koneksi ke shards cluster. Client terkoneksi ke mongos yang kemudian diteruskan ke shards. Developer tidak perlu memikirkan perbedaan proses mongos dan mongod, karena dalam level development aplication mereka memiliki bentuk yang sama, sehingga tidak perlu mengganti kode aplikasi ketika memutuskan untuk scale up database.

Ada beberapa manfaat yang bisa diambil dengan melakukan teknik ini, diantaranya adalah:
  • Dengan teknik ini, Anda dapat merencanakan ukuran media penyimpanan data pada tiap shard yang Anda miliki.
  • Menulis data akan lebih cepat daripada hanya pada satu mongod.
  • Proporsi data yang bisa disimpan dimemori bisa lebih banyak, ini tentunya akan menambah performa pemrosesan data.

Setting Up Sharding

Ada tiga hal yang harus kita ketahui untuk menerapkan sharding database ini:
1. Shard
Seperti yang sudah saya sebutkan diatas, tiap server yang menyimpan bagian-bagian collection(chunks) disebut sebagai shard. Tiap shard bisa memiliki satu mongod atau mungkin bisa lebih dari itu. Walaupun bisa lebih dari satu mongod, tetap saja yang dijadikan master hanya satu, mongod-mongod yang lain hanya digunakan sebagai slave jika sewaktu-waktu terjadi trouble pada master-nya (replica set).
2. Mongos
mongos berfungsi sebagai proses route request dan kemudian mengumpulkan responses untuk client. Bagian ini tidak dapat menyimpan data, sehingga konfigurasi nantinya disimpan pada config server.
3. Config server
Pada config server ini, mongos akan berpedoman. mongos akan membaca ini tiap kali ada read dan write operation database.

Komponen
Komponen

Menjalankan mongos process

Pertama yang kita butuhkan adalah membuat config server. Ini perlu Anda buat terlebih dahulu karena mongos akan membaca konfigurasi yang Anda tulis disana. Untuk membuatnya sama seperti kita membuat proses mongod biasa:
$ mkdir -p ~/dbs/config$ ./mongod --dbpath ~/dbs/config --port 20000
Config server ini tidak banyak membutuhkan space data, estimasinya hanya butuh 1KB untuk tiap 200MB data. Setelah config server ini dibuat, kemudian Anda dapat membuat proses mongos dengan memakai konfigurasi ini.
$ ./mongos --port 30000 --configdb localhost:20000
Proses mongos dan config server-nya berjalan pada mesin yang sama. Mongos berjalan pada port 30000, sedangkan config server berada pada port 20000. Anda pun dapat membuat beberapa config server dan kemudian menjalankan proses mongos dengan multi config server tersebut. Untuk tahap production, disarankan menjalankan mongos ini dengan beberapa config server, karena jika salah satu down maka client masih bisa membaca dan menulis data.

Menambahkan shard ke mongos process

Pada praktek sesungguhnya tentunya kita sudah memiliki mesin-mesin lain yang siap kita jadikan shard cluster. Tapi pada praktek yang ditunjukkan ini, semuanya masih berjalan pada satu mesin lokal. Disini misal saya memiliki sebuah proses mongod yang juga saya jalankan pada komputer lokal.
$ mkdir -p ~/dbs/shard1 
$ ./mongod --dbpath ~/dbs/shard1 --port 10000
Proses mongod yang saya buat berjalan pada port 10000 dan semua berkas datanya diletakkan pada direktori ~/dbs/shard1, sehingga untuk menjadikannya salah satu dari shards cluster mongos adalah sebagai berikut:
Pertama pergi ke shell javascript mongos, pada contoh mongos berada pada port 30000.
$ ./mongo localhost:30000/admin 
MongoDB shell version: 1.6.0 
url: localhost:30000/admin 
connecting to localhost:30000/admin 
type "help" for help>
Kemudian jalankan perintah untuk memasukkan proses mongod pada port 10000 sebagai shards cluster.
> db.runCommand({addshard : "localhost:10000", allowLocal : true}) 
{"added" : "localhost:10000","ok" : true}
"allowLocal" berarti shard yang saya tambahkan boleh pada mesin yang sama dengan mongos process. Key ini sangat membantu ketika masih tahap development. Tapi ketika sudah sampai tahap production, Anda seharusnya sudah memiliki proses mongod yang berjalan pada mesin lain. Dengan command "addshard" seperti pada contoh diatas, Anda dapat menambahkan semua proses mongod yang Anda punya pada proses mongos.

Sharding Data

MongoDB tidak secara otomatis memecah data dan mendistribusikannya. Anda masih dapat menentukan data pada collection mana yang dapat dipecah dan di store ke cluster. Untuk menentukan itu bisa menjalankan perintah "enablesharding" pada database yang Anda punya dan perintah "shardcollection" pada collectionnya. Semisal saya menginginkan data yang ada di collection "book" dengan database "office" bisa dipartisi sesuai dengan "_id" nya
> db.runCommand({"enablesharding" : "office"}) 
> db.runCommand({"shardcollection" : "office.book", "key" : {"_id" : 1}})
Dengan perintah diatas, collection "book" akan dipartisi berdasar "_id" nya. Ketika saya menambahkan data pada collection tersebut maka secara otomatis partisi data akan dilakukan oleh MongoDB.

Demikian artikel ini berakhir, masih banyak tips-tips bagus mengenai sharding mongodb. Informasi lebih lengkap mengenai sharding Mongodb dapat anda baca pada link berikut ini.

Artikel ini pernah dimuat di BisaKomputer.com tertanggal 22 Juli 2012

MongoDB Part 2: Operasi Dasar Manipulasi Data


Tulisan ini merupakan kelanjutan dari MongoDB part 1: Pengenalan Document-Oriented MongoDB. Pada part 2 ini saya akan memberikan beberapa perintah-perintah dasar yang dapat Anda lakukan untuk manipulasi document pada mongoDB. Tapi sebelum itu, saya tulis juga tutorial singkat instalasi MongoDB pada platform Windows dan Linux.

Installing MongoDB

MongoDB tersedia untuk platform Windows, Linux, Mac OS X, dan Solaris. Anda dapat menemukan dan men-download mongoDB pada alamat resmi mongoDB. Instalasinya cukup mudah untuk diikuti, berikut adalah cara menginstall database ini pada Windows dan Linux

Windows Install
Download windows zip pada halaman download mongodb disini. Ada dua pilihan untuk windows, 32-bit dan 64-bit version. Pilih salah satu sesuai dengan komputer kerja Anda. Download dan kemudian ekstrak pada direktori komputer.
Sampai disini Anda sudah dapat menjalankan mongo server dengan mengetikkan perintah berikut pada command line :
> bin\mongod.exe
Secara default semua berkas file database Anda akan tersimpan pada sebuah folder C:\data\db. Namun, jika Anda telah menyiapkan folder lain, anda dapat mendefinisikannya dengan memberikan parameter –-dbpath.
> bin\mongod.exe --dbpath C:\Documents and Settings\Username\My Documents\db
Untuk menjalankannya sebagai sebuah service, Anda dapat memberikan parameter -install. Selanjutnya Anda dapat menjalankan atau menghentikan mongoDB pada control panel Windows Anda.
 > bin\mongod.exe --install
Linux Install
Untuk versi Linux dan Mac OS dapat juga anda temukan pada halaman download MongoDB. Download dan kemudian decompress .tar.gz yang Anda dapatkan.
$ tar zxf mongodb-linux-i686-1.6.0.tar.gz
Sama seperti Windows install, Anda harus menyiapkan sebuah folder untuk menyimpan berkas file database. Buat folder baru dan setting permissionnya agar folder writable oleh MongoDB.
$ mkdir -p ~/db
$ chown -R $USER:$USER ~/db
Setelah menyiapkan folder database Anda dapat menjalankan MongoDB dengan --dbpath folder database Anda.
$ cd mongodb-linux-i686-1.6.0
$ bin/mongod --dbpath ~/db

Shell client mongoDB

MongoDB dilengkapi dengan Javascript shell client untuk para administrator dalam memanipulasi data. Shell client ini dapat dijalankan dengan perintah berikut:
$ bin/mongo
Perintah diatas menghubungkan Anda dengan service mongod yang jalan pada komputer yang sama, tetapi jika service berada pada server lain, Anda dapat menambahkan alamat server dan port nya seperti ini:
$ bin/mongo db.mimicreative.net:20000
Yang menarik dari shell ini adalah fitur connect yang dapat menghubungkan anda ke beberapa server cluster yang Anda punya. Caranya pun sangat mudah, Anda hanya memanggil method connect() dan kemudian menyimpannya pada sebuah variabel.
> mongos = connect("localhost:27017") connecting to: localhost:27017 localhost:27017
> shard0 = connect("db0.mimicreative.net:30000") connecting to: db0.mimicreative.net:30000 db0.mimicreative.net:30000
> shard1 = connect("db1.mimicreative.net:30001") connecting to: db1.mimicreative.net:30001 db1.mimicreative.net:30001
Contoh diatas, menghubungkan anda ke tiga server cluster. Ketiga server cluster itu kemudian diwakili oleh tiga variabel mongos, shard0 dan shard1. Untuk ulasan lebih lengkap mengenai ini, akan saya tulis pada bagian ketiga dari artikel ini.

Creating Document

Membuat document pada mongoDB dapat dilakukan dengan memanggil method insert yang ada pada masing-masing collection.
> db.post.insert({});
Pada perintah ini, objectid (_id) akan secara otomatis di-generate dan ditambahkan pada document.

Removing Document

Menghapus document pada sebuah collection dapat dilakukan dengan memanggil method remove().
> db.post.remove();
Perintah ini akan menghapus semua document yang ada pada collection post. Perintah remove ini menghapus semua document tapi tidak dengan collection dan semua index yang telah ada. Anda juga dapat menambahkan beberapa kriteria sebagai parameter pada method ini, sehingga hanya kriteria yang sesuai yang akan dihapus.
> db.post.remove({"title":"MongoDB"});

Updating Document

Untuk mengedit sebuah document, dapat memanfaatkan method update() yang juga ada pada collection. Method ini menerima dua parameter, pertama query atau kriteria document dan kedua document yang sudah anda edit. Contoh kasus ketika Anda ingin menambahkan "slug", mengubah last_modifikasi dan menghapus field parent_post yang ada pada document post.
{
"_id": ObjectId("4b2b9f67a1f631733d917a7a"),
"title": "Mongodb part II", "parent_post" : ObjectId("4b2b9f67a1f631733d913a1a"), "last_modifikasi": "Sat Jul 14 2012 11:30:02 GMT+0700 (WIT)";"content": "Lorem ipsum dolor sit amet", "pageviews":1 }
Maka perintah yang dapat anda ikuti untuk melakukan itu semua adalah seperti ini:
> thepost=db.posts.findOne({"title":"Mongodb part II"}); > thepost.slug = "mongodb-part-II"; > delete thepost.parent_post; > thepost.last_modifikasi = new Date();> db.posts.update({"title":thepost.title},thepost);
Update Modifiers
Modifiers ini berupa beberapa specials key yang akan sangat membantu Anda dalam hal updating document. Banyak specials key yang dapat anda gunakan disini, tapi saya akan contohkan beberapa saja seperti $inc, $set dan $push.
Modifiers $inc bisa anda gunakan untuk increment data number, contohnya ketika Anda ingin increment post view pada document.
> db.posts.update({"title" : "Mongodb part II"}, {"$inc" : {"pageviews" : 1}});
Perintah update diatas akan membuat pageviews yang sebelumnya bernilai 1 menjadi 2. Modifiers yang kedua adalah $set, sesuai namanya modifiers ini digunakan untuk mengganti value pada key, tapi jika key tidak ada maka secara otomatis akan ditambahkan. Contoh ketika anda ingin memberikan atau mengganti key "author" pada document post.
> db.post.update({"title":"Mongodb part II"},{"$set" : {"author" : "mustofa"}});
Modifiers $set ini juga dapat mengakses key pada embedded document, semisal Anda hanya ingin mengubah key "name" pada document ini
{
"_id": ObjectId("4b2b9f67a1f631733d917a7a"),
"title": "Mongodb part II", "author":{ "website:"http://blog.uin-malang.ac.id/mustofa" "name":"john doe", "email":"goo.muse@gmail.com", } "content": "Lorem ipsum dolor sit amet", }
maka perintah yang harus Anda lakukan adalah
> db.posts.update({"author.name" : "john doe"}, {"$set" : {"author.name" : "mustofa"}})
Modifiers terakhir adalah $push. Modifiers ini menambahkan element pada value yang bertipe array. Jika key tidak ada, secara otomatis membuat key dan element yang baru di push menjadi element pertama. Contohnya seperti anda menambahkan "comment" pada document post.
{
"_id": ObjectId("4b2b9f67a1f631733d917a7a"),
"_id": ObjectId("4b2b9f67a1f631733d917a7a"), "title": "Mongodb part II", "comments"[ { "content":"...." "name":"john doe", "email":"doe.john@gmail.com", }, ... ] }
maka ketika Anda ingin menambahkan komentar baru, Anda dapat melakukannya seperti ini :
> db.blog.posts.update({"title" : "Mongodb part II"}, {$push : {"comments" :{"name" : "josh", "email" : "josh@gmail.com", "content" : "nice post."}}});
Cukup tiga modifier itu saja yang dapat saya berikan, dan tentunya banyak modifier yang harus anda pelajari untuk updating data document. Silahkan buka link ini untuk mempelajari semua modifier yang dapat digunakan updating data.

Read Document

Untuk membaca document MongoDB, Anda dapat mengandalkan dua method ini, find() dan findOne()Method find() mengembalikan array document sedangkan findOne() hanya mengembalikan document tunggal pada sebuah collection.
> db.posts.find();
Memanggil find() tanpa ada query yang dimasukkan, seperti pada perintah diatas, akan mengembalikan semua document yang ada pada collection tersebut. Melakukan query pada find() cukup simple untuk dilakukan. Misalnya Anda menginginkan semua document yang memiliki sebuah "title" dan ditulis oleh seorang "author", maka Anda dapat melakukannya seperti berikut:
> db.posts.find({"title":"Mongodb part II","author.name":"mustofa"});
Method find() dan findOne() sebenarnya memiliki dua parameter, yang pertama adalah query seperti contoh diatas, dan yang kedua adalah option output keys document. Jika anda tidak mendefinisikan parameter kedua ini, maka secara default semua key yang ada pada document output akan dimunculkan. Hal ini tentunya tidak bagus jika Anda hanya membutuhkan beberapa key dari document tapi yang muncul semua. Dengan mendefinisikannya, Anda dapat mengatur key apa saja yang akan di ikut sertakan dalam document output.
> db.posts.find({},{"title":1,"author":1});
Contoh perintah diatas melakukan query dan hanya key "title" dan "author" saja yang akan diambil sebagai keluaran pada document.
Banyak operator yang dapat Anda gunakan untuk melakukan query document. Operator apa saja yang dapat dipakai untuk melakukan query, dapat Anda baca pada disini. Tapi disini tiga operator saja yang akan saya sebutkan.

Operator pertama adalah $in. Query dengan operator ini, akan mengembalikan semua document yang cocok dengan elemen-elemen yang diberikan padanya. Contoh pemanfaatannya semisal anda ingin mengambil semua document dari author john doe, josh, dan jeni, maka perintah yang dapat dilakukan adalah seperti ini:
> db.posts.find({"author.name":{$in:["john doe","josh","jeni"]}});
Operator yang kedua adalah $or. Operator ini memiliki fungsi yang sama dengan $in, bedanya $in melakukan fungsi OR hanya pada satu key dan $or melakukannya pada lebih dari satu key. Contohnya, mengambil semua document yang "created" dan "last_modified" pada hari ini, maka dapat dilakukan dengan:
> db.posts.find({$or:[{"created": new Date()},{"last_modified": new Date()}]});
Terakhir yaitu operator $not. Operator ini kebalikan dari $in, dimana akan mengembalikan document yang tidak termasuk pada elemen-elemen yang ada padanya. Contohnya anda ingin mengambil semua document kecuali document dengan author josh dan john doe, maka perintah yang dapat anda lakukan adalah:
> db.posts.find("author.name":{$not:["john doe","josh"]});

Kesimpulan

Sebenarnya masih banyak bahasan pada topik ini. Semua itu harus dipelajari jika anda memilih menggunakan database jenis ini. Anda dapat menemukan semuanya pada dokumentasi yang sudah disediakan oleh mongodb pada link ini.

Pada part 3 yaitu part terakhir dari tulisan ini, saya akan mengulas sharding process dalam rangka mempartisi data ke beberapa mesin di MongoDB.

Artikel ini pernah dimuat pada BisaKomputer.com tertanggal 16 Julai 2012

MongoDB Part 1: Pengenalan Document-Oriented MongoDB


Berbeda dengan MySQL, SQL Server atau PostgreSQL yang merupakan database bertipe relational database, MongoDB ini bukanlah termasuk itu. MongoDB adalah salah satu dari database NoSQL, yaitu sebuah konsep penyimpanan data non-relational. Istilah NoSQL ini juga bukan berarti “No SQL”, tapi merupakan kepanjangan dari “Not Only SQL”. Ada beberapa metode berbeda yang dipakai oleh database-database jenis ini untuk stored data, salah satunya adalah metode document-oriented yang digunakan oleh MongoDB.

Beberapa poin penting dari document-oriented dari MongoDB ini adalah:
  • Data unit dari MongoDB dikatakan sebagai document, ini sama dengan row dalam relational database.
  • Koleksi beberapa dokumen disimpan dalam collection, ini sama dengan table dalam relational database.
  • Database merupakan kumpulan dari beberapa collection. MongoDB dapat menerima lebih dari satu database secara independen.
  • MongoDB memiliki javascript shell yang sangat berguna untuk urusan administrasi dan manipulasi data. (ulasan akan saya sambung pada bagian 2 )
  • Data-data document akan dipisah dan kemudian di store ke beberapa komputer cluster (ulasan lengkap mengenai ini akan ada di artikel ini bagian 3)

Document

Diawal dikatakan bahwa unit utama dari database ini adalah document. Document disini merupakan data dengan beberapa key dan value. Struktur data seperti map, hash dan distionary merupakan beberapa bentuk representasi dari document yang kita bicarakan ini. Setiap bahasa pemrograman merepresentasikan dokumen ini berbeda-beda. Namun, di Javascript kita bisa menuliskan sebuah document seperti ini:
{
"title": "Mongodb part II",
"last_modifikasi": "Sat Jul 14 2012 11:30:02 GMT+0700 (WIT)";
"content": "Lorem ipsum dolor sit amet", "pageviews":1
}
Ini tampak seperti kita menulis data dengan format JSON, tapi format penulisan pada MongoDB lebih dikenal dengan nama BSON (Binary JSON). Ada beberapa keuntungan BSON daripada JSON, diantaranya adalah JSON tidak dapat menerima data dengan tipe date, sedangkan BSON dapat. JSON tidak dapat membedakan data integer, double dan float, dia hanya memiliki data dengan tipe data number (Double-precision floating-point format) sedangkan BSON dapat membedakannya, selain itu juga ada beberapa tipe data seperti symbol, regex, dan code yang tidak ada dalam JSON tapi ada di BSON.

Berikut adalah beberapa tipe data yang di support oleh MongoDB:
null: Tipe data ini untuk merepresentasikan null value atau ketidaksediaan key sebuah data
{
"email": "mustofa@mimicreative.net",
"website": null
}
boolean: Hanya ada dua nilai dari boolean, true atau false
{
"username":"mustofa",
"isAktif": true
}
32-bit integer: Tipe data ini tidak dapat digunakan pada javascript shell mongodb, hal ini karena javascript hanya support 64-bit floating point number. Memanipulasi data 32-bit integer pada shell akan di ubah ke bentuk 64-bit floating-point.
64-bit integer: Tipe data ini juga tidak dapat digunakan pada shell mongodb.
64-bit floating point number: Pada shell mongodb, semua number akan di ubah ke bentuk ini 64-bit floating point number
{"x" : 3.14, ”y”: 3}
string: String mongodb sudah menggunakan encoding unicode atau UTF8 (http://en.wikipedia.org/wiki/Unicode)
{"x" : "foobar"}
object id: Objek id yang pasti ada pada tiap document, berukuran 12-byte dan akan digenerate otomatis saat pembuatan document
{"x" : ObjectId()}
date
{"x" : new Date()}
regular expression: Sebuah key document juga bisa berisi regular expression (regex).
{"x" : /foobar/i}
code: Sebuah key document juga dapat menyimpan kode-kode javascript
{"x" : function() { /* ... */ }}
binary data: Tipe data ini tidak dapat dimanipulasi oleh javascript shell.
array: Ini merupakan kumpulan dari beberapa value, tapi yang harus diketahui disini bahwa tiap value dalam satu array boleh berbeda tipe datanya, contoh seperti
{"things" : ["pie", 3.14]}
embedded document: Tipe data ini memiliki arti dokumen yang memiliki atau embbed document lain. Contoh kasus, saya memiliki sebuah dokumen blog post seperti ini
{
"title":"Pengenalan MongoDB Part I",
"author":"Mustofa","content":"Lorem ipsum dolor sit amet"
}
Kalau pada RDBMS kita biasa memisahkan antara tabel post dengan komentarnya. Namun, untuk MongoDB document komentar dapat kita jadikan satu pada document post nya. Hal seperti inilah yang dimaksud dengan embedded document itu.
{
"title":"Pengenalan MongoDB Part I",
"author":"Mustofa",
"comment":
{
"author": "Didik",
"content":"Lorem ipsum dolor sit amet",
"date": new Date(),
}
}
Post document pastinya memiliki lebih dari satu komentar. Sehingga key “comment” seharusnya berbentuk array seperti ini

{ "title":"Pengenalan MongoDB Part I", "author":"Mustofa", "content":"Lorem ipsum dolor sit amet", "comment":[{"author":"John Doe","content”:"Dolor sit amet"},{"author":"Josh","content":"..."}] }

Collections

Jika document dianalogikan sebagai row, maka collection bisa dianalogikan seperti tabel. Analogi lain, collection sebuah folder dengan banyak file sebagai document-nya. Dari dua analogi itu, sudah sangat jelas bahwa collection ini terdiri dari satu atau banyak document independent.

Perlu kita ketahui adalah collection pada MongoDB bersifat schema-free. Ini bertolak belakang dengan RDBMS yang schema-full. Kalau pada MySQL tabel itu harus diinisialisasi dulu seperti jumlah kolom, nama kolom, primary key dan constrain-nya, maka schema-free berarti semua inisialisasi seperti itu tidak ada. Karena sifat schema-free inilah yang disebut sebut mempercepat performa mongodb daripada database jenis relational seperti SQL Server, MySQL ataupun PostgreSQL.

Database

Kumpulan satu atau lebih collection membentuk database. MongoDB bisa memiliki lebih dari satu database yang masing-masing memiliki permission dan masing-masing bisa disimpan pada sebuah file disk yang berbeda. Ini sangat bermanfaat saat anda memiliki beberapa aplikasi dengan banyak user tapi hanya satu server mongodb.

Mengapa harus memakai MongoDB?

Alasan utamanya karena mudahnya mengatur scale database. Scaling database bisa dilakukan dengan dua cara yang pertama scaling up (memperbesar kualitas mesin) dan yang kedua scaling out (partisi data ke beberapa mesin). Untuk sebuah web application yang besar akan sangat tidak efektif jika ditanggung oleh satu mesin. Terlebih lagi kebutuhan akan mesin dengan spesifikasi tinggi juga mahal, maka pilihan yang efektif untuk scaling database adalah dengan mem-partisi data ke beberapa mesin untuk menambah optimalisasi pemrosesan data. Mongodb telah dirancang sejak awal untuk urusan itu. Document-oriented yang dimiliki oleh MongoDB akan secara otomatis membagi data ke beberapa mesin. Penambahan mesin baru bisa dilakukan dengan mudah, cukup memasukkannya ke cluster dan biarkan MongoDB yang mengatur semuanya. Untuk ulasan lengkap tentang scale out ini akan saya tulis pada bagian tiga dari artikel ini.

Kesimpulan

MongoDB adalah salah satu jenis database NoSQL dengan model document-oriented. Mudahnya scaling out menjadikan pilihan tepat untuk web aplikasi yang memiliki traffic tinggi dan memiliki data besar. Tapi perlu dipahami juga adalah database jenis ini tidak menggantikan relational database. Mudahnya scaling out tidak mengartikan bahwa semua data aplikasi cocok memakai mongodb. Diawal dikatakan bahwa model database mongodb bersifat schema-free. Model ini dibangun tanpa relasi, constrain dan transactional process, sehingga sangat tidak tepat memakai mongodb pada aplikasi-aplikasi yang sarat dengan proses transaksi seperti perbankan, pergudangan, atau akunting.

Artikel ini pernah pernah dimuat oleh BisaKomputer.com tertanggal 15 Juli 2012