Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Node.js
Code

Pengantar Mongoose untuk MongoDB dan Node.js

by
Length:LongLanguages:
This post is part of a series called An Introduction to Mongoose for MongoDB and Node.js.
Bulk Import a CSV File Into MongoDB Using Mongoose With Node.js

Indonesian (Bahasa Indonesia) translation by Imam Firmansyah (you can also view the original English article)

Mongoose adalah sebuah framework JavaScript yang umumnya digunakan pada aplikasi Node.js dengan database MongoDB. Pada artikel ini, Saya akan memperkenalkan kepada Anda tentang Mongoose dan MongoDB, dan yang lebih penting dimana teknologi ini sesuai dengan aplikasi Anda.

Apa itu MongoDB?

Mari memulai dengan MongoDB. MongoDB adalah sebuah database yang menyimpan data Anda sebagai dokumen. Kebanyakan dokumen ini mirip seperti struktur JSON:

Sebuah dokumen kemudian diletakan dalam koleksi. Sebagai contoh, contoh dokumen diatas mendefinisikan sebuah obyek user. Obyek user ini kemudian akan secara khusus menjadi bagian dari sebuah koleksi yang disebut users.

Salah satu dari faktor penentu MongoDB adalah fleksibilitasnya dalam masalah struktur. Meskipun pada contoh pertama, obyek user berisikan sebuah properti firstName dan lastName, properti ini tidak dibutuhkan di setiap dokumen user yang merupakan bagian dari users collection. Inilah yang membuat MongoDB sangat berbeda dari database SQL seperti MySQL atau Microsoft SQL Server yang membutuhkan skema database yang sudah terdefinisikan pada setiap obyek yang disimpan.

Kemampuan untuk membuat obyek dinamis yang disimpan sebagai dokumen pada database adalah tempat dimana Mongoose bekerja.

Apa itu Mongoose?

Mongoose adalah sebuah Object Document Mapper (ODM). Ini berarti Mongoose mengizinkan Anda untuk mendefinisikan obyek dengan skema yang benar-benar diketik yang dipetakan ke sebuah dokumen MongoDB.

Mongoose menyediakan jumlah fungsionalitas yang luar biasa yang berkaitan dengan pembuatan dan pengerjaan skema. Mongoose saat ini memiliki delapan tipe skema dimana propertinya disimpan seperti saat berada di MongoDB. Diantaranya:

  1. String
  2. Number
  3. Date
  4. Buffer
  5. Boolean
  6. Mixed
  7. ObjectId
  8. Array

Setiap tipe data memungkinkan Anda untuk menentukan:

  • sebuah nilai default
  • sebuah fungsi validasi custom
  • menunjukan field yang dibutuhkan
  • fungsi get yang memungkinkan Anda untuk memanipulasi data sebelum dikembalikan sebagai obyek
  • sebuah set fungsi yang memungkinkan Anda untuk memanipulasi data sebelum disimpan ke database
  • membuat indeks yang memungkinkan data agar ditarik secara lebih cepat

Selanjutnya untuk opsi umum ini, tipe data tertentu memungkinkan Anda untuk menyesuaikan lebih lanjut bagaimana data disimpan dan diambil dari database. Sebagai contoh, sebuah tipe data String juga memungkinkan Anda untuk menentukan pilihan tambahan sebagai berikut:

  • mengubah menjadi huruf kecil
  • mengubah menjadi huruf besar
  • memangkas data sebelum disimpan
  • regular-expression yang dapat membatasi data yang diizinkan untuk disimpan selama dalam proses validasi
  • sebuah enum yang dapat menentukan daftar string yang valid

Properti Number dan Date keduanya mendukung penentuan nilai minimal dan maksimal yang diizinkan untuk field tersebut.

Sebagian besar dari delapan jenis data yang diizinkan seharusnya cukup familiar untuk Anda. Namun, ada beberapa pengecualian yang mungkin menjadi pengecualian bagi Anda, seperti BufferMixedObjectId, dan Array.

Tipe data Buffer memungkinkan Anda untuk menyipan data biner. Contoh yang umum untuk data biner seperti gambar atau file encodem seperti dokumen PDF.

Tipe data Mixed mengubah properti menjadi field "dapat menjadi apa saja". Field ini menyerupai berapa banyak pengembang yang menggunakan MongoDB karena tidak ada struktur yang jelas. Berhati-hatilah menggunakan tipe data ini karena tipe ini kehilangan banyak fitur hebat yang disediakan oleh Mongoose, seperti validasi data dan pendeteksi perubahan entitas untuk dapat mengetahui secara otomatis dalam memperbarui properti saat menyimpan.

Tipe data ObjectId umumnya menentukan sebuah tautan ke dokumen yang lain di dalam database Anda. Sebagai contoh, jika anda memiliki sebuah koleksi buku dan penulis, dokumen buku kemungkinan berisi sebuah properti ObjectId yang menunjuk ke penulis tertentu dari dokumen.

Tipe data Array memungkinkan anda untuk menyimpan array yang seperti JavaScript. Dengan sebuah tipe data Array, anda dapat melakukan operasi array Javascript yang umum, seperti push, pop, shift, slice, dll.

Rekap Singkat

Sebelum melanjutkan dan menghasilkan beberapa kode, Saya ingin mengulang apa yang baru saja kita pelajari. MongoDB adalah database yang memungkinkan Anda menyimpan dokumen dengan struktur dinamis. Dokumen-dokumen ini disimpan di dalam koleksi.

Mongoose adalah pustaka JavaScript yang memungkinkan Anda menentukan skema dengan data yang strongly-typed.  Setelah skema didefinisikan, Mongoose memungkinkan Anda membuat Model berdasarkan skema tertentu. Model Mongoose kemudian dipetakan ke Dokumen MongoDB melalui definisi skema Model.

Setelah Anda menentukan skema dan model Anda, Mongoose berisi banyak fungsi berbeda yang memungkinkan Anda untuk memvalidasi, menyimpan, menghapus, dan men-query data Anda menggunakan fungsi MongoDB yang umum. Saya akan membicarakan hal ini lebih dengan contoh kode yang konkrit untuk diikuti.

Menginstall MongoDB

Sebelum kita dapat memulai membuat skema dan model Mongoose kita, MongoDB harus terinstal dan terkonfigurasi. Saya menyarankan untuk mengunjungi Halaman download MongoDB.  Ada beberapa pilihan berbeda yang tersedia untuk menginstall. Saya telah terhubung ke Server Community. Hal ini memungkinkan Anda menginstal versi tertentu ke sistem operasi Anda. MongoDB juga menawarkan Server Enterprise Server dan instalasi bantuan cloud. Karena seluruh buku bisa ditulis saat menginstal, menyetel, dan memantau MongoDB, saya akan tetap dengan Server Community.

Setelah anda selesai mendownload dna menginstall MongoDB untuk sistem operasi pilihan anda, Anda harus memulai database. Daripada membuat wheel baru, Saya menyarankan anda mengunjungi dokumentasi MongoDB's tentang bagaimana menginstall MongoDB Edisi Community.

Saya akan menunggu di sini saat Anda mengkonfigurasi MongoDB. Bila sudah siap, kita bisa melanjutkan untuk menyiapkan Mongoose untuk terhubung ke database MongoDB yang baru diinstal.

Menyiapkan Mongoose

Mongoose adalah framework JavaScript, dan saya akan menggunakannya dalam aplikasi Node.js. Jika Anda sudah menginstal Node.js, Anda dapat melanjutkan ke langkah berikutnya. Jika Anda tidak menginstal Node.js, saya sarankan Anda memulai dengan mengunjungi Halaman Download Node.js dan pilih installer untuk sistem operasi Anda.

Setelah Node.js telah disetel dan siap digunakan, Saya akan membuat aplikasi baru dan kemudian menginstal Mongoose NPM Package.

Dengan command prompt yang disetel ke aplikasi yang Anda inginkan untuk diinstall, Anda dapat menjalankan perintah berikut:

Untuk inisialisasi aplikasi saya, saya biarkan semuanya ke nilai default. Sekarang saya akan menginstal paket mongoose sebagai berikut:

Dengan semua prasyarat yang dikonfigurasi, mari kita hubungkan ke database MongoDB. Saya telah menempatkan kode berikut di dalam file index.js karena saya memilihnya sebagai titik awal untuk aplikasi saya:

Baris pertama termasuk pustaka mongoose. Kemudian, Saya membuka sebuah koneksi ke database yang saya sebut mongoose_basics menggunakan fungsi connect.

Fungsi connect menerima dua pilihan parameter lainnya. Parameter kedua adalah sebuah pilihan obyek dimana kamu dapan mendefinisikan hal-hal seperti username dan password jika diperlukan. Parameter yang ketiga, yang dapa juga menjadi parameter kedua jika anda tida mempunyai pilihan, adalah fungsi callback setelah mencoba untuk menghubungkan. Fungsi callback dapat digunakan dalam satu dari dua cara:

Untuk menghindari pengantar potensial pada JavaScript Promises, Saya akan menggunakan cara pertama. Di bawah ini adalah file index.js yang telah diupdate:

Jika error terjadi saat menghubungkan ke database, exception akan dilempar dan proses selanjutnya akan dihentikan. Saat tidak terjadi error, Saya akan mengirim pesan sudah login ke console.

Mongoose sekarang telah disetel dan dihubungkan ke database yang disebut mongoose_basics. Koneksi MongoDB saya tidak menggunakan username, password, atau port custom. Jika anda ingin menyetel pilihan ini atau pilihan yang lain selama menghubungkan, Saya menyarankan anda mengunjungi Mongoose Documentation on connecting. Dokumentasi ini menyediakan penjelasan terperinci dari berbagai pilihan yang tersedia termasuk bagaimana membuat multiple connection, connection pooling, replika, dll.

Setelah koneksi telah sukses, mari berpindah ke pendefinisian Skema Mongoose.

Mendefinisikan Skema Mongoose

Saat pendahuluan, Saya menunjukan sebuah obyek user yang berisi dua properti: firstName dan lastName. Pada contoh berikut, saya telah menerjemahkan dokumen tersebut ke dalam Skema Mongoose:

Ini adalah Skema yang sangat mendasar yang hanya berisi dua properti tanpa ada attribut yang terkait dengannya. Mari memperluas contoh ini dengan mengkonversi properti first dan last name menjadi obyek child dari properti name.  Properti name akan meliputi kedua dari first dan last name. Saya juga akan menambahkan sebuah properti created yang bertipe Date.

Seperti yang anda lihat, Mongoose memungkinkan saya untuk membuat skema yang sangat fleksibel dengan banyak kombinasi memungkinkan yang berbeda tentang bagaimana saya bisa mengorganisir data Saya.

Pada contoh selanjutnya, Saya akan membuat dua skema baru yang akan mendemonstrasikan bagaimana cara membuat relasi ke skema yang lain: author dan book. Skema book berisi sebuah referensi ke skema author.

Contoh diatas adalah skema author yang diperluas berdasarkan konsep dari skema user yang saya ciptakan pada contoh sebelumnya. Untuk menghubungkan antara Author dan Book, Properti pertama dari skema author adalah sebuah properti _id yang merupakan tipe skema ObjectId_id adalah sintaks yang umum untuk membuat primary key pada Mongoose dan MongoDB. Kemudian, seperti skema user, Saya telah mendefinisikan sebuah properti name yang berisikan first dan last name author.

Perluasan dari skema user schema, author berisi beberapa tipe skema String yang lain. Saya juda sudah menambahkan sebuah tipe skema Buffer yang dapat menaruh gambar profil pengarangnya.  Properti terakhir memegang tanggal pembuatan penulis; Namun, Anda mungkin memperhatikannya dibuat sedikit berbeda karena telah ditetapkan nilai default "now". Ketika seorang penulis berada pada database, properti ini akan diset ke tanggal / waktu sekarang.

Untuk melengkapi contoh skema, mari membuat skema book schema yang berisi sebuah referesi ke penulis menggunakan tipe skema ObjectId:

Skema book berisi beberapa properti dari tipe String. Seperti disebutkan diatas, skema itu berisikan sebuah referensi ke skema author. Untuk mendemonstrasikan definisi skema yang powerful secara lebih jauh, skema book juga berisikan sebuah Array dari ratings. Setiap rating terdiri atas sebuah summarydetailnumberOfStars, dan properti date created.

Mongoose memungkinkan anda kelenturan dalam membuat skema dengan drferesi ke skema yang lain atau, sebagaimana contoh diatas dengan properti ratings, hal ini memungkinkan anda untuk membuat sebuah Array dari properti child yang dapat terisi dalam skema relasi (seperti book ke author) atau dalam barisan sebagaimana contoh diatas (dengan book untuk sebuah rating Array).

Membuat dan Menyimpan Model Mongoose

Setelah skema author dan book mendemonstrasikan kelenturan skema Mongoose, Saya akan lanjut menggunakan skema tersebut dan memperoleh sebuah model Author dan Book darinya.

Sebuah Model Mongoose, saat disimpan, membuat sebuah dokumen di MongoDB dengan properti yang didefinisikan oleh skema asal.

Untuk menunjukan pembuatan dan penyimpanan sebuah obyek, pada contoh yang selanjutnya, Saya akan membuat beberapa obyek: Sebuah Model Author dan beberapa model Book. Setelah dibuat, obyek ini akan disimpan ke MongoDB menggunakan metode save dari Model.

Pada contoh di atas, saya tanpa malu-malu menghubungkan referensi ke dua buku terbaru saya. Contohnya dimulai dengan membuat dan menyimpan jamieObject yang dibuat dari Model Author.  Di dalam fungsi save dari jamieObject, jika terjadi kesalahan, aplikasi akan mengeluarkan exception. Bila save berhasil, di dalam fungsi save, dua objek buku dibuat dan disimpan. Serupa dengan jamieObject, jika terjadi kesalahan saat menyimpan, kesalahan akan muncul; Jika tidak, pesan sukses dikeluarkan di console.

Untuk membuat referensi ke Author, obyek buku mereferesi kedua skema author primary key _id dalam properti author dari skema book.

Validasi Data Sebelum Disimpan

Umumnya untuk data yang akan menghasilkan model untuk diisi oleh formulir pada halaman web. Karena itu, ada baiknya memvalidasi data ini sebelum menyimpan Model ke MongoDB.

Pada contoh selanjutnya, Saya telah menguppdate skema author sebelumnya untuk menambahkan validasi dari properti berikut: firstNametwitterfacebook, dan linkedin.

Properti firstName sudah diberikan attribut dengan properti required. Sekarang saat saya amemanggil fungsi save, Mongoose akan mengembalikan sebuah pesan eror yang mengindikasikan properti firstName dibutuhkan. Saya memilih tidak menggunakan properti lastName required dalam kasus Cher atau Madonna akan menjadi author di database Saya.

Properti twitterfacebook, dan linkedin semuanya memiliki validator kustom yang sangat mirip dengan yang diterapkan pada mereka. Mereka masing-masing memastikan bahwa nilai dimulai dengan nama domain jejaring sosial masing-masing.  Field ini tidak diperlukan, jadi validator hanya akan diterapkan bila data disupply untuk properti tersebut.

Mencari dan Mengupdate Data

Pengantar Mongoose tidak akan lengkap tanpa contoh mencari untuk record dan mengupdate satu atau lebih properti pada objek tersebut.

Mongoose menyediakan beberapa fungsi berbeda untuk menemukan data untuk Model tertentu. Fungsi tersebut adalah findfindOne, dan findById.

Fungsi find dan findOne keduanya menerima objek sebagai masukan yang memungkinkan pencarian kompleks, sedangkan findById hanya menerima satu nilai dengan fungsi callback (contoh akan segera disertakan). Dalam contoh selanjutnya, saya akan menunjukkan bagaimana menemukan semua buku yang berisi string "mvc" di judul mereka.

Di dalam fungsi find, Saya mencari string dengan case insensitif "mvc" pada properti title. Hal ini dilakukan dengan menggunakan sintaks yang sama untuk mencari string dengan JavaScript.

Fungsi find call juga dirantai ke metode query lainnya, seperti whereandorlimitsortany, dll.

Mari kita memperluas contoh sebelumnya untuk membatasi hasil kita ke lima buku pertama dan mengurutkan pada tanggal yang tercipta secara menurun. Fungsi ini akan mengembalikan lima buku terbaru yang berisi "mvc" di judulnya.

Setelah menerapkan fungsi find, urutan fungsi lainnya tidak penting karena semua fungsi yang dirantai dikompilasi menjadi satu query tunggal dan tidak dieksekusi sampai fungsi exec dipanggil.

Seperti yang saya sebutkan sebelumnya, findById dijalankan sedikit berbeda. Fungsi ini segera dijalankan dan menerima fungsi callback, ketimbang membiarkan serangkaian fungsi. Dalam contoh berikut ini, saya melakukan query author tertentu dengan _id mereka.

_id pada kasus Anda mungkin sedikit berbeda. Saya menyalin _id ini dari sebuah console.log sebelumnya saat menemukan sebuah daftar book dengan "mvc" pada judulnya.

Begitu sebuah objek telah dikembalikan, Anda dapat memodifikasi propertinya untuk mengupdatenya. Setelah Anda membuat perubahan yang diperlukan, Anda memanggil metode save, seperti saat Anda membuat obyek. Dalam contoh berikut, saya akan memperluas contoh findbyId dan update properti linkedin pada author.

Setelah author berhasil diambil, properti linkedin telah disetel dan fungsi save telah dipanggil.  Mongoose mampu mendeteksi bahwa properti linkedin telah diubah, dan akan mengirimkan pernyataan update ke MongoDB hanya pada properti yang telah dimodifikasi. Jika terjadi kesalahan saat menyimpan, exception akan dilempar dan akan menghentikan aplikasi. Saat sukses, pesan sukses masuk ke konsol.

Mongoose juga menawarkan dua fungsi tambahan yang membuat pencarian objek dan menyimpannya dalam satu langkah dengan fungsi yang diberi nama dengan tepat: findByIdAndUpdate dan findOneAndUpdate. Mari update contoh sebelumnya untuk menggunakan findByIdAndUpdate.

Pada contoh sebelumnya, properti yang akan diperbarui disupply sebagai objek ke parameter kedua dari fungsi findByIdAndUpdate. Fungsi callback sekarang menjadi parameter ketiga. Saat update berhasil, objek author kembali berisi informasi terbaru. Obyek ini masuk ke konsol untuk melihat properti penulis yang diperbarui.

Contoh Kode Terakhir

Sepanjang artikel ini, saya memberikan potongan kecil kode untuk mengidentifikasi tindakan yang sangat spesifik, seperti membuat skema, membuat model, dll. Mari kita menggabungkan semuanya dalam contoh lengkap.

Pertama, Saya membuat dua file tambahan: author.js dan book.js. File ini berisikan definisi skema dan kreasi model masing-masing. baris yang terakhir dari kode berikut meembuat model tersedia untuk digunakan pada file index.js.

Mari memulai dengan file author.js:

Selanjutnya datangnya file book.js:

Dan Terakhir, file index.js yang telah diupdate:

Pada contoh diatas, semua aksi Mongoose berisi di dalamnya fungsi connect. File author dan book termasuk dengan fungsi require setelah memasukan pustaka mongoose library.

Dengan berjalannya MongoDB, anda sekara bisa menjalankan aplikasi Node.js yang lengkap dengan perintah sebagai berikut:

Setelah saya menyimpan beberapa data saya ke database saya, Saya perbarui file index.js file fungsi pencari sebagai berikut:

Sekali lagi, Anda dapat menjalankan aplikasi dengan perintah: node index.js.

Kesimpulan

Setelah membaca artikel ini, Anda seharusnya dapat membuat Skema dan Model Mongol yang sangat fleksibel, menerapkan validasi sederhana atau kompleks, membuat dan memperbarui dokumen, dan akhirnya mencari dokumen yang telah dibuat.

Semoga sekarang Anda merasa nyaman menggunakan Mongoose. Jika Anda ingin belajar lebih banyak, saya sarankan untuk meninjau ulang Panduan Mongoose yang menyelidiki topik yang lebih maju seperti populasi, middleware, janji, dll.

Selamat Berburu (referensi hewan Mongoose yang buruk)!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.