Terjemahan artikel disiapkan pada malam dimulainya kursus
Highlights:
- Sangatlah penting untuk mengembangkan skema meskipun itu opsional di MongoDB.
- Demikian pula, indeks harus sesuai dengan skema dan pola akses Anda.
- Hindari menggunakan objek besar dan array besar.
- Berhati-hatilah dengan pengaturan MongoDB, terutama dalam hal keamanan dan keandalan.
- MongoDB tidak memiliki pengoptimal kueri, jadi Anda harus berhati-hati saat melakukan operasi kueri.
Saya telah bekerja dengan database sejak lama, tetapi baru saja menemukan MongoDB. Ada beberapa hal yang saya harap saya ketahui sebelum saya mulai mengerjakannya. Ketika seseorang sudah memiliki pengalaman di bidang tertentu, mereka memiliki prasangka tentang apa itu database dan apa yang mereka lakukan. Dengan harapan dapat memudahkan orang lain untuk memahaminya, saya menyajikan daftar kesalahan umum.
Membuat server MongoDB tanpa otentikasi
Sayangnya, MongoDB diinstal tanpa otentikasi secara default. Untuk stasiun kerja yang diakses secara lokal, praktik ini normal. Namun karena MongoDB merupakan sistem multi-user yang suka menggunakan memori dalam jumlah besar, akan lebih baik jika Anda meletakkannya di server dengan RAM sebanyak mungkin, meskipun Anda hanya akan menggunakannya untuk pengembangan. Menginstal di server melalui port default dapat menimbulkan masalah, terutama jika ada kode javascript yang dapat dijalankan dalam permintaan (misalnya, $where
sebagai ide untuk
Ada beberapa metode autentikasi, namun yang paling mudah adalah dengan menetapkan ID pengguna/kata sandi. Gunakan ide ini saat Anda memikirkan tentang otentikasi mewah berdasarkan
Jangan lupa untuk mengikat permukaan serangan Anda ke MongoDB
,
или
. Karena file data tidak dienkripsi dalam MongoDB standar, masuk akal untuk menjalankan MongoDB
Kesalahan saat mengembangkan sirkuit
MongoDB tidak menggunakan skema. Namun bukan berarti skema tersebut tidak diperlukan. Jika Anda hanya ingin menyimpan dokumen tanpa pola yang konsisten, menyimpannya bisa cepat dan mudah, namun mengambilnya nanti bisa jadi sulit.
Artikel klasik "
Jangan lupa urutannya
Melupakan urutan pengurutan dapat menyebabkan lebih banyak frustrasi dan membuang lebih banyak waktu dibandingkan konfigurasi salah lainnya. Secara default MongoBD menggunakan
Buat koleksi dengan dokumen besar
MongoDB dengan senang hati menghosting dokumen besar hingga 16MB dalam koleksi, dan
Membuat dokumen dengan array besar
Dokumen dapat berisi array. Yang terbaik adalah jika jumlah elemen dalam array jauh dari angka empat digit. Jika elemen sering ditambahkan ke dalam array, maka jumlah dokumen yang memuat elemen tersebut akan bertambah besar dan hal ini perlu dilakukan
MongoDB memiliki sesuatu yang disebut
Anda mungkin berpikir bahwa Anda dapat melakukannya tanpa pengindeksan array. Sayangnya, kurangnya indeks dapat menyebabkan Anda mengalami masalah lain. Karena dokumen dipindai dari awal hingga akhir, pencarian elemen di akhir larik akan memakan waktu lebih lama, dan sebagian besar operasi yang terkait dengan dokumen tersebut akan memakan waktu lebih lama.
Jangan lupa bahwa urutan tahapan dalam suatu agregasi itu penting
Dalam sistem database dengan pengoptimal kueri, kueri yang Anda tulis adalah penjelasan tentang apa yang ingin Anda dapatkan, bukan bagaimana cara mendapatkannya. Mekanisme kerja ini mirip dengan pemesanan di restoran: biasanya Anda hanya memesan hidangan, dan tidak memberikan instruksi rinci kepada juru masak.
Di MongoDB, Anda menginstruksikan juru masak. Misalnya, Anda perlu memastikan bahwa datanya lolos reduce
sedini mungkin dalam penggunaan pipa $match
и $project
, dan penyortiran hanya terjadi setelahnya reduce
, dan pencarian dilakukan sesuai urutan yang Anda inginkan. Memiliki pengoptimal kueri yang menghilangkan pekerjaan yang tidak perlu, mengurutkan langkah secara optimal, dan memilih jenis gabungan dapat memanjakan Anda. Dengan MongoDB, Anda memiliki kendali lebih besar dengan mengorbankan kenyamanan.
Alat seperti
Menggunakan Perekaman Cepat
Jangan pernah menyetel opsi penulisan MongoDB agar memiliki kecepatan tinggi tetapi keandalannya rendah. Modus ini "file-dan-lupakan" tampaknya cepat karena perintah dikembalikan sebelum penulisan terjadi. Jika sistem crash sebelum data ditulis ke disk, maka data tersebut akan hilang dan berakhir dalam keadaan tidak konsisten. Untungnya, MongoDB 64-bit telah mengaktifkan logging.
Mesin penyimpanan MMAPv1 dan WiredTiger menggunakan logging untuk mencegah hal ini, meskipun WiredTiger dapat memulihkan ke kondisi terakhir yang konsisten.
Penjurnalan memastikan bahwa database berada dalam keadaan konsisten setelah pemulihan dan menyimpan semua data hingga ditulis ke jurnal. Frekuensi perekaman dikonfigurasi menggunakan parameter
.
Untuk memastikan entri, pastikan logging diaktifkan di file konfigurasi
, dan frekuensi perekaman sesuai dengan jumlah informasi yang dapat Anda hilangkan.
Menyortir tanpa indeks
Saat mencari dan menggabungkan, sering kali ada kebutuhan untuk mengurutkan data. Semoga hal ini dilakukan pada salah satu tahap akhir, setelah memfilter hasilnya untuk mengurangi jumlah data yang diurutkan. Dan bahkan dalam hal ini, untuk penyortiran Anda memerlukannya
Jika tidak ada indeks yang sesuai, MongoDB akan melakukannya tanpa indeks tersebut. Ada batasan memori sebesar 32 MB pada ukuran total semua dokumen di dalamnya
Cari tanpa dukungan indeks
Kueri pencarian menjalankan fungsi yang mirip dengan operasi GABUNG di SQL. Agar berfungsi dengan baik, mereka memerlukan indeks nilai kunci yang digunakan sebagai kunci asing. Hal ini tidak jelas karena penggunaannya tidak tercermin explain()
. Indeks tersebut merupakan tambahan dari indeks yang tertulis di dalamnya explain()
, yang pada gilirannya digunakan oleh operator saluran pipa $match
и $sort
, ketika mereka bertemu di awal pipa. Indeks sekarang dapat mencakup tahapan apa pun
Memilih untuk tidak menggunakan multi-pembaruan
metode
digunakan untuk mengubah sebagian dokumen yang sudah ada atau keseluruhan dokumen, hingga penggantian seluruhnya, tergantung parameter yang Anda tentukan
. Yang tidak begitu jelas adalah ia tidak akan memproses semua dokumen dalam koleksi kecuali Anda menyetel opsinya
untuk memperbarui semua dokumen yang memenuhi kriteria permintaan.
Jangan lupa pentingnya urutan kunci dalam tabel hash
Di JSON, sebuah objek terdiri dari kumpulan tak berurutan dengan ukuran nol atau lebih pasangan nama/nilai, di mana nama adalah string dan nilai adalah string, angka, boolean, null, objek, atau array.
Sayangnya, BSON sangat mengutamakan keteraturan saat melakukan pencarian. Di MongoDB, urutan kunci dalam objek bawaan { firstname: "Phil", surname: "factor" }
- ini tidak sama dengan { { surname: "factor", firstname: "Phil" }
. Artinya, Anda harus menyimpan urutan pasangan nama/nilai dalam dokumen Anda jika ingin yakin menemukannya.
Jangan bingung "Batal" и "belum diartikan"
Nilai "belum diartikan" tidak pernah valid di JSON, menurut $null
, yang tidak selalu merupakan solusi yang baik.
Menggunakan $limit()
tanpa $sort()
Seringkali ketika Anda mengembangkan di MongoDB, ada gunanya melihat contoh hasil yang akan dikembalikan dari kueri atau agregasi. Untuk tugas ini Anda perlu $limit()
, tetapi kode tersebut tidak boleh ada dalam kode akhir kecuali Anda menggunakannya sebelumnya $sort
. Mekanik ini diperlukan karena jika tidak, Anda tidak dapat menjamin urutan hasilnya, dan Anda tidak akan dapat melihat data dengan andal. Di bagian atas hasil, Anda akan mendapatkan entri berbeda tergantung pada penyortirannya. Agar dapat bekerja dengan andal, kueri dan agregasi harus bersifat deterministik, yaitu memberikan hasil yang sama setiap kali dijalankan. Kode yang berisi $limit()
, tapi tidak $sort
, tidak akan bersifat deterministik dan selanjutnya dapat menyebabkan kesalahan yang sulit dilacak.
Kesimpulan
Satu-satunya cara untuk kecewa dengan MongoDB adalah dengan membandingkannya secara langsung dengan jenis database lain, seperti DBMS, atau menggunakannya berdasarkan ekspektasi tertentu. Ini seperti membandingkan jeruk dengan garpu. Sistem basis data melayani tujuan tertentu. Yang terbaik adalah memahami dan menghargai sendiri perbedaan-perbedaan ini. Akan sangat disayangkan jika menekan pengembang MongoDB melalui jalur yang memaksa mereka menempuh jalur DBMS. Saya ingin melihat cara-cara baru dan menarik untuk memecahkan masalah lama, seperti memastikan integritas data dan menciptakan sistem data yang tahan terhadap kegagalan dan serangan berbahaya.
Pengenalan transaksionalitas ACID MongoDB di versi 4.0 adalah contoh yang baik dalam memperkenalkan perbaikan penting dengan cara yang inovatif. Transaksi multi-dokumen dan multi-pernyataan kini bersifat atomik. Dimungkinkan juga untuk menyesuaikan waktu yang diperlukan untuk memperoleh kunci dan menghentikan transaksi yang macet, serta mengubah tingkat isolasi.
Baca selengkapnya:
Sumber: www.habr.com