Review: MongoDB menghadapi dunia

Jika Anda telah membangun aplikasi web ukuran sedang hingga besar dalam beberapa tahun terakhir, Anda mungkin mempertimbangkan untuk mendasarkannya pada LAMP open source atau tumpukan MEAN. Tumpukan LAMP yang lebih lama menggunakan sistem operasi Linux, server web Apache, database relasional MySQL, dan bahasa pemrograman PHP. MEAN menggunakan database MongoDB NoSQL, framework aplikasi web back-end Express, platform aplikasi Angular, dan runtime JavaScript Node.js. MEAN pada dasarnya adalah tumpukan JavaScript ujung ke ujung. Linux tidak secara eksplisit disebutkan dalam akronim, tetapi biasanya OS di bawah Node.

Dalam ulasan ini, saya akan membahas database MongoDB, sekarang di versi 4. MongoDB adalah database operasional yang sangat skalabel dan tersedia dalam versi perusahaan open source dan komersial, dan dapat dijalankan di tempat atau sebagai layanan cloud terkelola. Layanan cloud terkelola disebut MongoDB Atlas.

MongoDB adalah database NoSQL yang paling populer. Model data dokumennya memberi pengembang fleksibilitas tinggi, sementara arsitektur terdistribusi memungkinkan skalabilitas yang hebat. Akibatnya, MongoDB sering dipilih untuk aplikasi yang harus mengelola volume data yang besar, yang mendapatkan keuntungan dari skalabilitas horizontal, dan yang menangani struktur data yang tidak sesuai dengan model relasional.  

Karena MongoDB sesuai untuk berbagai macam kasus penggunaan, MongoDB sering kali diajukan sebagai pengganti database relasional. Namun, meskipun kebebasan dari batasan skema yang kaku sering kali bermanfaat, penting untuk diingat bahwa tidak ada database dokumen yang merupakan solusi universal — bahkan MongoDB.

Asal MongoDB

Perusahaan di balik MongoDB didirikan pada tahun 2007 sebagai 10gen oleh tim yang berada di belakang DoubleClick, perusahaan periklanan Internet. Motivasi asli database MongoDB adalah untuk dapat menangani kelincahan dan skala yang diperlukan untuk periklanan Internet. Sebagai contoh skala, DoubleClick menayangkan 400.000 iklan per detik pada tahun 2007, dan kesulitan untuk tampil dengan database yang ada pada saat itu.

MongoDB adalah toko berbasis dokumen yang juga memiliki penyimpanan berbasis grafik yang diimplementasikan di atasnya. Jenis lain dari database NoSQL adalah penyimpanan nilai kunci dan penyimpanan berbasis kolom. Semua jenis database NoSQL memiliki kemampuan untuk menskalakan dengan cara yang tidak mungkin dilakukan dalam database relasional SQL tahun 2007, tetapi jenis database NoSQL yang berbeda memiliki kekuatan, kelemahan, dan kasus penggunaan yang berbeda.

Beberapa pesaing utama NoSQL untuk MongoDB sebagai database operasional adalah Amazon DynamoDB (penyimpanan nilai-kunci), Google Cloud BigTable (penyimpanan kolom), Google Cloud Datastore (penyimpanan dokumen), Redis (dalam memori, penyimpanan nilai-kunci), Couchbase (nilai kunci multi-model dan penyimpanan dokumen), DataStax / Cassandra (penyimpanan kolom), dan Azure Cosmos DB (multi-model termasuk opsi SQL serta beberapa penyimpanan NoSQL).

Apa itu MongoDB?

MongoDB Inc. mendeskripsikan MongoDB sebagai "database dokumen dengan skalabilitas dan fleksibilitas yang Anda inginkan dengan pembuatan kueri dan pengindeksan yang Anda butuhkan." Untuk menguraikannya, pertama-tama kita perlu memahami sifat database dokumen, yang merupakan salah satu jenis desain NoSQL.

Daripada menyimpan data yang diketik dengan kuat dalam tabel yang dinormalisasi terkait dengan skema tetap seperti database relasional, database dokumen menyimpan data terkait dalam bentuk de-normalisasi yang disematkan dalam dokumen nilai nama seperti JSON. MongoDB tidak benar-benar menyimpan JSON, namun: MongoDB toko BSON (Binary JSON), yang memperpanjang JSON representasi (string) untuk menyertakan jenis tambahan seperti int, long, date, floating point, decimal128, dan koordinat geospasial, seperti yang ditunjukkan dalam diagram di bawah. Dokumen BSON berisi satu atau lebih bidang, dan setiap bidang berisi nilai dari tipe data tertentu, termasuk array, data biner, dan sub dokumen . BSON juga melacak ukuran setiap dokumen, untuk memungkinkan pencarian yang efisien.

MongoDB

Pengetikan BSON dimasukkan ke dalam pengindeksan bidang. MongoDB dapat menghasilkan grafik multi-modal, geospasial, B-tree, dan indeks teks lengkap pada satu salinan data, menggunakan jenis data untuk menghasilkan jenis indeks yang benar. MongoDB memungkinkan Anda membuat indeks pada bidang dokumen apa pun.

MongoDB

MongoDB memiliki database, koleksi (tabel), dokumen (baris), bidang (kolom), indeks, $lookupatau dokumen yang disematkan (gabungan), kunci utama, pipa agregasi, dan transaksi. Untuk kinerja yang lebih baik dan untuk menghindari perlunya transaksi multi-dokumen, Anda mungkin ingin menggunakan subdocuments dan array di MongoDB daripada menyimpan data Anda dalam bentuk yang dinormalisasi seperti yang Anda lakukan dalam database SQL.

MongoDB 4 memang memiliki transaksi multi-dokumen, yang berarti Anda masih bisa mendapatkan properti ACID meskipun Anda harus menormalkan desain data Anda. Versi sebelumnya tidak.

Untuk apa nilainya, perwakilan MongoDB memberi tahu saya bahwa transaksi dokumen tunggal menangani 90 persen kasus penggunaan yang membutuhkan properti ACID. Ketika pelanggan membutuhkan ACID untuk transaksi multi-dokumen sebelum versi 4, mereka pada dasarnya menerapkannya sendiri di tingkat aplikasi.

Secara default, MongoDB menggunakan skema dinamis, terkadang disebut tanpa skema. Dokumen dalam satu koleksi tidak perlu memiliki kumpulan bidang yang sama, dan tipe data untuk bidang bisa berbeda di seluruh dokumen dalam satu koleksi. Anda dapat mengubah struktur dokumen kapan saja.

Namun, tata kelola skema tersedia. Mulai MongoDB 3.6, MongoDB mendukung validasi skema JSON. Untuk mengaktifkannya, gunakan $jsonSchemaoperator dalam ekspresi validator Anda. Validasi terjadi selama pembaruan dan penyisipan.

Seperti yang Anda lihat di snapshot dokumentasi dan screenshot MongoDB Atlas di bawah ini, MongoDB memiliki bahasa kuerinya sendiri, diimplementasikan di shell Mongo, di 12 API driver bahasa yang didukung (dan banyak lagi dari komunitas), dan di Compass GUI dan Tab Koleksi Atlas (Penjelajah Data). Bahasa kueri MongoDB sama sekali tidak sama dengan SQL, tetapi ada lebih atau kurang pemetaan langsung di antara keduanya. Saya mengatakan "lebih atau kurang" karena database relasional tidak mendukung dokumen yang disematkan, tetapi MongoDB mendukung. Itu belum tentu semuanya baik, seperti yang akan Anda lihat di bagian selanjutnya.

MongoDB MongoDB

Kerangka agregasi MongoDB menggunakan operator pipeline yang kurang lebih setara dengan SQL GROUP BYdan WHEREklausa. Misalnya, kueri berikut menggunakan database grup pengguna MongoDB untuk membuat daftar acara masa lalu dan total RSVP untuk setiap acara, di shell Mongo:

> db.past_events.aggregate ([{'$ match': {'batchID': 101, 'event.status': 'past', 'event.group.urlname': {'$ in': ['Atlanta-MongoDB -User-Group ',' Austin-MongoDB-User-Group ',' Baltimore-MongoDB-Users-Group ',' Bangalore-MongoDB-User-Group ',' Belfast-MongoDB-User-Group ',' Bergen-NoSQL ',' Grup-Pengguna-Bordeaux-MongoDB ',' Grup-Pengguna-Boston-MongoDB ']}}},

{'$ group': {'_id': {'urlname': '$ event.group.urlname', 'year': {'$ year': '$ event.time'}}, 'event_count': {' $ sum ': 1},' rsvp_count ': {' $ sum ':' $ event.yes_rsvp_count '}}},

{'$ project': {'_id': 0, 'group': '$ _id.urlname', 'year': '$ _id.year', 'event_count': 1, 'rsvp_count': 1}}])

Query menggunakan aggregatefungsi dengan $match, $in, $group, $sum, dan $projectoperator dan mengembalikan berikut:

{"event_count": 2, "rsvp_count": 27, "group": "Boston-MongoDB-User-Group", "year": 2017}

{"event_count": 5, "rsvp_count": 94, "group": "Boston-MongoDB-User-Group", "year": 2016}

{"event_count": 5, "rsvp_count": 231, "group": "Boston-MongoDB-User-Group", "year": 2015}

{"event_count": 3, "rsvp_count": 175, "group": "Boston-MongoDB-User-Group", "year": 2014}

{"event_count": 10, "rsvp_count": 489, "group": "Boston-MongoDB-User-Group", "year": 2013}

{"event_count": 12, "rsvp_count": 444, "group": "Boston-MongoDB-User-Group", "year": 2012}

{ "event_count" : 2, "rsvp_count" : 118, "group" : "Boston-MongoDB-User-Group", "year" : 2011 }

{ "event_count" : 6, "rsvp_count" : 84, "group" : "Atlanta-MongoDB-User-Group", "year" : 2011 }

{ "event_count" : 3, "rsvp_count" : 74, "group" : "Baltimore-MongoDB-Users-Group", "year" : 2012 }

{ "event_count" : 1, "rsvp_count" : 5, "group" : "Bergen-NoSQL", "year" : 2015 }

{ "event_count" : 15, "rsvp_count" : 286, "group" : "Atlanta-MongoDB-User-Group", "year" : 2012 }

{ "event_count" : 11, "rsvp_count" : 321, "group" : "Baltimore-MongoDB-Users-Group", "year" : 2013 }

{ "event_count" : 8, "rsvp_count" : 124, "group" : "Bangalore-MongoDB-User-Group", "year" : 2015 }

{ "event_count" : 6, "rsvp_count" : 381, "group" : "Bangalore-MongoDB-User-Group", "year" : 2013 }

{ "event_count" : 7, "rsvp_count" : 242, "group" : "Bangalore-MongoDB-User-Group", "year" : 2012 }

{ "event_count" : 13, "rsvp_count" : 233, "group" : "Atlanta-MongoDB-User-Group", "year" : 2013 }

{ "event_count" : 10, "rsvp_count" : 171, "group" : "Baltimore-MongoDB-Users-Group", "year" : 2014 }

{ "event_count" : 3, "rsvp_count" : 28, "group" : "Austin-MongoDB-User-Group", "year" : 2017 }

{ "event_count" : 2, "rsvp_count" : 52, "group" : "Austin-MongoDB-User-Group", "year" : 2016 }

{ "event_count" : 1, "rsvp_count" : 8, "group" : "Atlanta-MongoDB-User-Group", "year" : 2018 }

Type "it" for more

MongoDB also has a mapReduce function. The Compass GUI has an aggregation pipeline builder that makes creating queries such as the one above fairly straightforward.

MongoDB supports a range of server data consistency levels starting with read uncommitted and going to causal. Causal consistency was only added in version 3.6, and is also supported in client sessions. The client sets read and write concerns to specify the desired consistency level.

Di MongoDB, operasi tulis bersifat atomik pada level satu dokumen, bahkan jika operasi tersebut mengubah beberapa dokumen yang disematkan dalam satu dokumen. Ketika operasi tulis tunggal (mis. db.collection.updateMany()) Mengubah beberapa dokumen, modifikasi setiap dokumen bersifat atom, tetapi operasi secara keseluruhan tidak bersifat atom. Mulai versi 4.0, untuk situasi yang memerlukan atomicity untuk pembaruan beberapa dokumen atau konsistensi antara pembacaan ke beberapa dokumen, MongoDB menyediakan transaksi multi-dokumen untuk set replika, dengan biaya kinerja.