Highlight:
- Sangat penting untuk mendesain skema meskipun itu opsional di MongoDB.
- Demikian pula, indeks harus cocok 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 untuk waktu yang sangat lama, tetapi baru saja menemukan MongoDB. Ada beberapa hal yang ingin saya ketahui sebelum memulai. Ketika seseorang sudah memiliki pengalaman di bidang tertentu, mereka memiliki gagasan sebelumnya tentang apa itu database dan apa yang mereka lakukan. Dengan harapan memudahkan orang lain untuk memahaminya, berikut daftar kesalahan yang umum terjadi.
Membuat Server MongoDB Tanpa Autentikasi
Sayangnya, MongoDB diinstal tanpa otentikasi secara default. Biasanya workstation diakses secara lokal. Namun karena MongoDB adalah sistem multi-pengguna yang suka menggunakan memori dalam jumlah besar, sebaiknya Anda meletakkannya di server dengan RAM sebanyak mungkin, bahkan jika Anda hanya akan menggunakannya untuk pengembangan. Menginstal di server melalui port default dapat menjadi masalah, terutama jika ada kode javascript yang dapat dijalankan dalam permintaan (misalnya,
$wheresebagai ide untuk injeksi ).
Ada beberapa metode otentikasi, tetapi yang paling mudah adalah mengatur ID pengguna / kata sandi. Ambil ide ini saat Anda berpikir tentang otentikasi berbasis LDAP . Dalam hal keamanan, MongoDB harus selalu diperbarui dan log harus selalu diperiksa untuk akses yang tidak sah. Misalnya, saya suka memilih port berbeda sebagai port default.
Ingatlah untuk mengikat permukaan serangan ke MongoDB
Daftar Periksa Keamanan MongoDB berisi tip bagus untuk mengurangi risiko gangguan jaringan dan kebocoran data. Sangat mudah untuk mengabaikannya dan mengatakan bahwa server pengembangan tidak membutuhkan tingkat keamanan yang tinggi. Namun, semuanya tidak sesederhana itu dan ini berlaku untuk semua server MongoDB. Secara khusus, kecuali ada alasan kuat untuk menggunakan
mapReduce, groupatau $ where , Anda harus menonaktifkan penggunaan kode JavaScript arbitrer dengan menulis di file konfigurasi javascriptEnabled:false. Karena file data tidak dienkripsi dalam MongoDB standar, masuk akal untuk menjalankan MongoDB dengan Pengguna Khusus yang memiliki akses file penuh, dengan akses terbatas hanya untuk dirinya dan kemampuan untuk menggunakan kontrol akses file sistem operasi itu sendiri.
Kesalahan desain sirkuit
MongoDB tidak menggunakan skema. Tapi ini tidak berarti sirkuit tidak diperlukan. Jika Anda hanya ingin menyimpan dokumen tanpa tata letak yang konsisten, menyimpan dapat dilakukan dengan cepat dan mudah, tetapi mengambilnya nanti bisa sangat sulit .
Artikel klasik " 6 aturan praktis untuk desain skema MongoDB" layak dibaca, sementara fitur seperti Schema Explorer di alat pihak ketiga Studio 3T layak digunakan untuk validasi skema reguler.
Jangan lupa urutannya
Melupakan tata urutan dapat menjadi kesalahan konfigurasi yang paling menjengkelkan dan boros. MongoBD menggunakan urutan biner secara default . Tetapi tidak mungkin itu akan berguna bagi siapa pun. Jenis biner yang peka huruf besar dan peka terhadap stres dianggap sebagai anakronisme yang aneh bersama dengan manik-manik, kaftan, dan kumis keriting di tahun 80-an abad terakhir. Sekarang penggunaannya tidak bisa dimaafkan. Dalam kehidupan nyata "sepeda motor" sama dengan "sepeda motor". Dan "Inggris" dan "Inggris" adalah satu tempat yang sama. Huruf kecil hanyalah huruf besar yang setara dengan huruf kapital. Dan jangan membuatku berbicara tentang penyortiran diakritik. Gunakan pemeriksaan case-insensitive saat membuat database di MongoDByang sesuai dengan bahasa dan budaya pengguna sistem . Ini akan sangat menyederhanakan pencarian Anda untuk data string.
Membuat Koleksi dengan Dokumen Besar
MongoDB dengan senang hati menghosting dokumen berukuran besar hingga 16MB dalam koleksi, dan GridFS dirancang untuk dokumen besar yang lebih besar dari 16MB. Tetapi hanya karena dokumen besar dapat ditempatkan di sana, bukanlah ide yang baik untuk menyimpannya di sana. MongoDB akan bekerja paling baik jika Anda menyimpan dokumen individual dalam ukuran beberapa kilobyte, memperlakukannya lebih seperti baris dalam tabel SQL yang lebar. Dokumen yang besar akan menjadi sumber masalah kinerja .
Buat dokumen dengan array besar
Dokumen bisa berisi array. Cara terbaik adalah jika jumlah elemen dalam array jauh dari angka empat digit. Jika elemen sering ditambahkan ke larik, itu akan menjadi lebih besar dari dokumen yang memuatnya, dan itu perlu dipindahkan , yang berarti bahwa indeks perlu diperbarui juga . Saat mengindeks ulang dokumen dengan array besar, indeks akan sering ditimpa, karena untuk setiap elemen ada record yang menyimpan indeksnya. Pengindeksan ulang ini juga terjadi saat dokumen disisipkan atau dihapus.
MongoDB memiliki apa yang disebut "faktor pengisian" yang menyediakan ruang bagi dokumen untuk berkembang guna meminimalkan masalah ini.
Anda mungkin berpikir bahwa Anda dapat melakukannya tanpa mengindeks array. Sayangnya, karena kurangnya indeks, Anda mungkin mengalami masalah lain. Karena dokumen dipindai dari awal hingga akhir, akan memakan waktu lebih lama untuk menemukan elemen di akhir larik, dan sebagian besar operasi yang terkait dengan dokumen semacam itu akan lambat .
Jangan lupa urutan tahapan dalam agregasi itu penting
Dalam sistem database pengoptimal kueri, kueri yang Anda tulis adalah penjelasan tentang apa yang ingin Anda dapatkan, bukan cara mendapatkannya. Mekanisme ini bekerja dengan analogi dengan memesan di restoran: biasanya Anda hanya memesan hidangan, dan tidak memberikan instruksi detail kepada chef.
Di MongoDB, Anda menginstruksikan juru masak. Misalnya, Anda perlu memastikan bahwa data masuk
reducesedini mungkin dalam pipeline menggunakan $matchdan $project, dan pengurutan hanya terjadi setelahnya reduce, dan bahwa penelusuran terjadi tepat sesuai urutan yang Anda butuhkan. Memiliki pengoptimal kueri yang menghilangkan pekerjaan yang tidak perlu, mengatur tahapan secara optimal, dan memilih jenis koneksi dapat merusak Anda. Di MongoDB, Anda memiliki kontrol lebih dengan mengorbankan kenyamanan.
Alat sepertiStudio 3T akan memudahkan pembuatan kueri agregasi di MongoDB . Editor Agregasi memungkinkan Anda menerapkan pernyataan pipeline satu per satu, serta memvalidasi data masukan dan keluaran di setiap langkah untuk menyederhanakan proses debug.
Menggunakan perekaman cepat
Jangan pernah mengatur parameter tulis MongoDB dengan kecepatan tinggi tetapi keandalan rendah. Mode "file-and-forget" ini tampak cepat karena perintah kembali sebelum penulisan dilakukan. Jika sistem macet sebelum data ditulis ke disk, itu akan hilang dan dalam keadaan tidak konsisten. Untungnya, MongoDB 64-bit telah mengaktifkan logging.
Mesin penyimpanan MMAPv1 dan WiredTiger menggunakan pencatatan untuk mencegah hal ini, meskipun WiredTiger dapat memulihkan ke pos pemeriksaan terakhir yang cocok jika pencatatan dinonaktifkan.
Penjurnalan memastikan bahwa database berada dalam keadaan yang konsisten setelah pemulihan dan menyimpan semua data hingga ditulis ke jurnal. Frekuensi entri dikonfigurasi menggunakan parameter
commitIntervalMs.
Untuk memastikan catatan, pastikan bahwa pencatatan diaktifkan di file konfigurasi
(storage.journal.enabled)dan frekuensi catatan sesuai untuk jumlah informasi yang dapat Anda kehilangan.
Menyortir tanpa indeks
Saat mencari dan menggabungkan, seringkali perlu untuk mengurutkan data. Mudah-mudahan, ini dilakukan di salah satu tahap terakhir, setelah memfilter hasil untuk mengurangi jumlah data yang diurutkan. Meski begitu, Anda memerlukan indeks untuk mengurutkan . Anda dapat menggunakan satu atau beberapa indeks.
Jika tidak ada indeks yang sesuai, MongoDB tidak akan melakukannya. Ada batas memori 32MB untuk ukuran total semua dokumen dalam operasi pengurutan , dan jika MongoDB mencapai batas ini, itu akan membuat kesalahan atau mengembalikan kumpulan data kosong .
Cari tanpa dukungan indeks
Kueri pencarian melakukan fungsi yang mirip dengan operasi GABUNG di SQL. Untuk mendapatkan performa terbaik, mereka membutuhkan indeks dari nilai kunci yang digunakan sebagai kunci asing. Ini tidak jelas karena penggunaan tidak tercermin dalam
explain(). Indeks tersebut merupakan tambahan dari indeks yang tertulis explain(), yang pada gilirannya digunakan oleh operator pipeline $matchdan $sort, saat muncul di awal pipeline. Indeks sekarang dapat mencakup tahap mana pun dari pipa agregasi .
Menyisih dari menggunakan multi-pembaruan
Metode ini
db.collection.update()digunakan untuk mengubah sebagian dari dokumen yang ada atau seluruh dokumen, hingga penggantian lengkap, tergantung pada parameter yang Anda tentukan update. Tidak begitu jelas bahwa itu tidak akan memproses semua dokumen dalam koleksi sampai Anda menyetel opsi multiuntuk memperbarui semua dokumen yang memenuhi kriteria kueri.
Jangan lupa tentang pentingnya urutan kunci dalam tabel hash
Di JSON, sebuah objek terdiri dari kumpulan nol atau lebih pasangan nama / nilai yang tidak berurutan, di mana nama adalah string dan nilai adalah string, angka, boolean, nol, objek, atau larik.
Sayangnya, BSON sangat mementingkan pesanan saat mencari. Di MongoDB, urutan kunci dalam objek sebaris penting , mis.
{ firstname: "Phil", surname: "factor" }Tidak sama dengan { { surname: "factor", firstname: "Phil" }. Artinya, Anda harus menyimpan urutan pasangan nama / nilai dalam dokumen jika ingin memastikan Anda menemukannya.
Jangan bingung antara "null" dan "undefined"
Nilai "tidak ditentukan" tidak pernah valid di JSON menurut standar JSON resmi (ECMA-404, Bagian 5), meskipun digunakan dalam JavaScript. Selain itu, untuk BSON itu tidak digunakan lagi dan diubah menjadi
$null, yang tidak selalu merupakan solusi yang baik. Hindari menggunakan "tidak ditentukan" di MongoDB .
Gunakan $limit()tanpa$sort()
Sangat sering, saat Anda mengembangkan di MongoDB, akan sangat membantu jika Anda hanya melihat contoh hasil yang akan ditampilkan dari kueri atau agregasi. Ini berguna untuk tugas ini
$limit(), tetapi tidak boleh ada dalam versi terakhir kode, kecuali Anda menggunakannya di depannya $sort. Mekanik ini diperlukan karena jika tidak, Anda tidak dapat menjamin urutan hasil dan Anda tidak dapat melihat data dengan andal. Di bagian atas hasil, Anda akan mendapatkan rekaman berbeda tergantung pada jenisnya. Untuk bekerja dengan andal, kueri dan agregasi harus bersifat deterministik, yaitu menghasilkan hasil yang sama setiap kali dieksekusi. Kode, yang $limit()ada tetapi tidak $sort, tidak akan menjadi deterministik dan selanjutnya dapat menyebabkan kesalahan yang akan sulit dilacak.
Kesimpulan
Satu-satunya cara untuk menjadi frustrasi dengan MongoDB adalah membandingkannya secara langsung dengan jenis database lain, seperti DBMS, atau menemukan beberapa harapan khusus untuk menggunakannya. Ini seperti membandingkan jeruk dengan garpu. Sistem database memiliki tujuan tertentu. Yang terbaik adalah memahami dan menghargai perbedaan ini untuk diri Anda sendiri. Akan memalukan untuk memberikan tekanan pada pengembang MongoDB karena jalur yang memaksa mereka untuk mengikuti jalur DBMS. Saya ingin melihat cara baru dan menarik untuk menyelesaikan masalah lama, seperti memastikan integritas data dan membangun sistem data yang tahan terhadap kegagalan dan serangan oleh pengguna jahat.
Implementasi transaksionalitas ACID 4.0 MongoDB adalah contoh yang baik tentang betapa pentingnya inovasi. Transaksi multi-dokumen dan multi-statement sekarang bersifat atomic. Juga dimungkinkan untuk menyesuaikan waktu yang diperlukan untuk memperoleh kunci dan menyelesaikan transaksi yang digantung, serta mengubah tingkat isolasi.