Dalam postingan ini, kami akan menunjukkan cara menggunakan Mongoose untuk penerapan MongoDB Anda guna membuat solusi berbasis skema yang lebih mudah untuk memodelkan data aplikasi Anda.
Apa itu Luwak?
Mongoose adalah “pemodelan objek MongoDB yang elegan untuk Node.js “. Jika Anda pernah menggunakan MongoDB sebelumnya dan mencoba operasi basis data dasar, Anda mungkin memperhatikan bahwa MongoDB “tanpa skema”. Saat Anda ingin menerapkan database yang lebih terstruktur dan ingin memanfaatkan kekuatan MongoDB, Mongoose adalah salah satu ODM (O objek D ata L aplikasi) solusi.
Untuk mendemonstrasikan dengan cepat, Anda menjalankan perintah insert ke dalam koleksi bernama users seperti ini:
db.users.insert({ name : 'Arvind', gender : 'male'});
Dan tepat setelah itu, Anda dapat menjalankan:
db.users.insert({ name : 'Arvind', gender : 'male', password : '!@#$'});
dan MongoDB tidak akan pernah mengeluh tentang variasi jumlah kolom (pasangan nilai kunci). Ini sangat fleksibel. Tetapi ketika Anda ingin menyimpan data Anda lebih terorganisir dan terstruktur, Anda perlu mempertahankannya dalam kode server Anda, menulis validasi, memastikan tidak ada yang tidak relevan disimpan dalam koleksi. Di sinilah Mongoose membuat hidup menjadi mudah.
“Mongoose memberikan solusi langsung berbasis skema untuk memodelkan data aplikasi Anda dan mencakup typecasting bawaan, validasi, pembuatan kueri, kait logika bisnis, dan banyak lagi , di luar kotak.”
Instal Node.js &MongoDB
Untuk menggunakan Mongoose, kita perlu menginstal Node.js. Anda dapat menemukan infonya di sini.
Mulai Berkembang
Pertama, mari kita buat taman bermain kecil tempat kita bisa bersenang-senang. Buat folder baru bernama myMongooseApp dan buka terminal/Prompt di sini dan jalankan:
npm init
Ini akan membantu kita dalam menginisialisasi proyek node baru. Isi sesuai kebutuhan. Selanjutnya, kita akan menginstal Mongoose sebagai ketergantungan pada proyek kita. Jalankan:
npm install mongoose --save-dev
Kemudian, mulai layanan MongoDB dengan menjalankan:
mongod
Selanjutnya, buat file baru bernama index.js di root dan buka di editor favorit Anda. Tambahkan kode di bawah ini:
var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/myTestDB'); var db = mongoose.connection; db.on('error', function (err) { console.log('connection error', err); }); db.once('open', function () { console.log('connected.'); });
Di sini, kita memerlukan paket Mongoose untuk terhubung ke database dan menginisialisasi koneksi. Nama database kami adalah myTestDB.
Kemudian, jalankan:
node index.js
Anda sekarang akan melihat pesan yang terhubung. Anda juga dapat menggunakan paket node bernama nodemon untuk memulai ulang server node secara otomatis saat ada perubahan.
Sekarang, kotak pasir kami siap dimainkan!
Skema Luwak
Skema seperti kerangka, tulang telanjang dari tampilan pengumpulan data Anda. Jika Anda berurusan dengan kumpulan pengguna, skema Anda akan terlihat seperti ini:
Name - String Age - Number Gender - String Date of Birth - Date
Jika Anda berurusan dengan kumpulan produk, skema Anda akan terlihat seperti ini:
SKU - String Name - String Price - Number InStock - Boolean Quantity - Number
Anda dapat melihat penyimpangannya. Ketika data kita dijaga dengan skema seperti ini, kemungkinan menyimpan data sampah berkurang drastis.
Sekarang setelah kita memahami skema, mari kita coba dan buat skema pengguna menggunakan Mongoose. Kembali ke index.js dan tambahkan kode di bawah ini:
var Schema = mongoose.Schema; var userSchema = new Schema({ name : String, age : Number, DOB : Date, isAlive : Boolean });
Temukan kolom dasar terkait pengguna dan jenis skemanya di sini.
Selanjutnya, kita akan membuat model dari skema. Tambahkan:
var User = mongoose.model('User', userSchema);
Itu dia, model pengguna kami sudah siap! Kami akan menggunakan ini sebagai skema dasar kami untuk memasukkan pengguna ke dalam database. Dengan cara ini, kita tahu bahwa setiap dokumen dalam kumpulan pengguna akan memiliki bidang yang terdaftar di skema. Mari buat instance pengguna baru dan simpan ke DB. Tambahkan:
var arvind = new User({ name : 'Arvind', age : 99, DOB : '01/01/1915', isAlive : true }); arvind.save(function (err, data) { if (err) console.log(err); else console.log('Saved : ', data ); });
Anda akan melihat sesuatu seperti ini:
Saved : { __v: 0, name: 'Arvind', age: 99, DOB: Fri Jan 01 1915 00:00:00 GMT+0530 (IST), isAlive: true, _id: 536a4866dba434390d728216 }
Tidak ada masalah, tidak ada masalah. API yang sederhana dan mudah untuk berinteraksi dengan Model.
Misalnya kita ingin setiap model memiliki metode bernama isYounger. Metode ini akan mengembalikan true jika usia kurang dari 50, dan false jika lebih besar. Kita dapat melakukan ini dengan menanyakan database untuk pengguna saat ini, kemudian memeriksa pengkondisian dan mengembalikan nilai benar atau salah.
Tetapi bagaimana jika kita ingin menerapkan metode ini ke semua model skema Pengguna? Beginilah cara kami melakukannya di Mongoose:
var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/myTestDB'); var db = mongoose.connection; db.on('error', function (err) { console.log('connection error', err); }); db.once('open', function () { console.log('connected.'); }); var Schema = mongoose.Schema; var userSchema = new Schema({ name : String, age : Number, DOB : Date, isAlive : Boolean }); userSchema.methods.isYounger = function () { return this.model('User').age < 50 ? true : false; } var User = mongoose.model('User', userSchema); var arvind = new User({ name : 'Arvind', age : 99, DOB : '01/01/1915', isAlive : true }); arvind.save(function (err, data) { if (err) console.log(err); else console.log('Saved ', data ); }); console.log('isYounger : ',arvind.isYounger());
Pada baris 21, kita menambahkan definisi metode, dan hasil pada baris 39 akan salah. Ini adalah cara sederhana dan praktis untuk menambahkan metode ke skema Anda, membuatnya lebih berorientasi objek.
Jika Anda memiliki bidang kata sandi, Anda dapat menambahkan metode seperti encryptPassword(), untuk mengenkripsi kata sandi dan comparePassword(), untuk membandingkan kata sandi saat login dengan userSchema itu sendiri. Anda dapat membaca lebih lanjut tentang Otentikasi kata sandi di sini.
Out-of-the-box Mongoose juga menyediakan beberapa opsi saat skema dibuat. Misalnya, jika Anda melihat deklarasi skema di bawah ini, kami memberikan opsi strict:false:
var userSchema = new Schema({ name : String, age : Number, DOB : Date, isAlive : Boolean }, {strict : false});
Opsi ketat benar secara default dan tidak memungkinkan pasangan nilai kunci 'non-skema' disimpan. Misalnya, ini akan disimpan:
var arvind = new User({ name : 'Arvind', age : 99, DOB : '01/01/1915', isAlive : true });
Sedangkan:
var arvind = new User({ name : 'Arvind', age : 99, DOB : '01/01/1915', isAlive : true, bucketList : [{...}, {...}, {...} ] });
Semua hal di atas akan disimpan tanpa array bucketList karena tidak dideklarasikan sebagai bagian dari skema. Jadi, tidak ada klien yang menggunakan layanan Anda yang dapat membuang data yang tidak valid ke dalam koleksi Anda.
Opsi keren lainnya adalah koleksi. Jika Anda tidak ingin nama model Anda sama dengan nama koleksi, Anda dapat meneruskan nama tersebut sebagai opsi seperti:
var userSchema = new Schema({ name : String, age : Number, DOB : Date, isAlive : Boolean }, {collection : 'appusers'});
Anda dapat menemukan daftar opsi lain di sini.
Dengan Mongoose, Anda juga dapat menambahkan acara ke skema Anda seperti pra-penyimpanan atau penyimpanan pasca, di mana Anda dapat melakukan validasi, memproses data, atau menjalankan kueri lain di acara masing-masing. Metode ini disebut sebagai Middlewares.
Contoh sederhana dapat berupa middleware paralel seperti:
var userSchema = new Schema({ name : String, age : Number, DOB : Date, isAlive : Boolean }) schema.pre('save', true, function (next, done) { // calling next kicks off the next middleware in parallel next(); doAsync(done); });
Anda dapat membaca lebih lanjut tentang middlewares di sini. Di postingan berikutnya, kita akan berbicara lebih banyak tentang menggunakan Yeoman untuk membuat scaffolding secara otomatis untuk proyek MongoDB Anda.
Terima kasih sudah membaca. Beri komentar.
@arvindr21