Jadi, untuk langsung menjawab pertanyaan...
Penyimpanan tanpa skema tentu saja merupakan alasan kuat untuk menggunakan MongoDB, tetapi seperti yang telah Anda tunjukkan, cukup mudah untuk menyimpan JSON dalam RDBMS juga. Kekuatan di balik MongoDB ada pada kueri yang kaya terhadap penyimpanan tanpa skema.
Jika saya dapat menunjukkan kesalahan kecil dalam ilustrasi tentang memperbarui bidang JSON, ini bukan hanya masalah mendapatkan nilai saat ini, memperbarui dokumen dan kemudian mendorongnya kembali ke database. Semua proses harus dibungkus dalam sebuah transaksi. Transaksi cenderung cukup mudah, sampai Anda mulai mendenormalisasi database Anda. Kemudian sesuatu yang sederhana seperti merekam upvote dapat mengunci tabel di seluruh skema Anda.
Dengan MongoDB, tidak ada transaksi. Tetapi operasi hampir selalu dapat terstruktur dengan cara yang memungkinkan pembaruan atom. Ini biasanya melibatkan beberapa perubahan dramatis dari paradigma SQL, tetapi menurut saya mereka cukup jelas setelah Anda berhenti mencoba memaksa objek ke dalam tabel. Paling tidak, banyak orang lain yang mengalami masalah yang sama dengan yang Anda hadapi, dan komunitas Mongo cenderung cukup terbuka dan vokal tentang tantangan yang telah mereka atasi.
Dengan "penulisan aman" saya berasumsi maksud Anda opsi untuk mengaktifkan "getLastError()" otomatis setelah setiap penulisan. Kami memiliki pembungkus yang sangat tipis di atas DBCollection yang memungkinkan kami mengontrol secara halus kapan getLastError() dipanggil. Namun, kebijakan kami tidak didasarkan pada seberapa "pentingnya" data, melainkan apakah kode yang mengikuti kueri mengharapkan modifikasi apa pun untuk segera terlihat dalam pembacaan berikut.
Secara umum, ini masih merupakan indikator yang buruk, dan kami telah bermigrasi ke findAndModify() untuk perilaku yang sama. Saat kita masih secara eksplisit memanggil getLastError() adalah saat database cenderung menolak penulisan, seperti saat kita memasukkan() dengan _id yang mungkin merupakan duplikat.
Saya khawatir saya tidak dapat berbicara tentang apakah kebijakan pencadangan/pemulihan kami efektif karena kami belum harus memulihkan. Kami mengikuti rekomendasi MongoDB untuk membuat cadangan; @mark-hillick telah melakukan pekerjaan yang bagus untuk meringkasnya. Kami menggunakan set replika, dan kami telah memigrasikan versi MongoDB serta memperkenalkan anggota replika baru. Sejauh ini kami tidak memiliki waktu henti, jadi saya tidak yakin saya dapat berbicara dengan baik sampai saat ini.
Jadi, menurut pengalaman saya, MongoDB menawarkan penyimpanan data tanpa skema dengan seperangkat primitif kueri yang cukup kaya sehingga transaksi sering kali dapat digantikan oleh operasi atom. Sulit untuk melupakan pengalaman SQL selama 10+ tahun, tetapi setiap masalah yang saya temui telah ditangani oleh komunitas atau 10gen secara langsung. Kami tidak kehilangan data atau downtime yang dapat saya ingat.
Sederhananya, MongoDB adalah ekosistem penyimpanan data terbaik yang pernah saya gunakan dalam hal kueri, pemeliharaan, skalabilitas, dan keandalan. Kecuali jika saya memiliki aplikasi yang sangat jelas relasional sehingga saya tidak dapat menggunakan apa pun selain SQL, saya akan melakukan segala upaya untuk menggunakan MongoDB.
Saya tidak bekerja untuk 10gen, tetapi saya sangat berterima kasih kepada orang-orang yang bekerja.