Pernah nggak kamu frustrasi bikin tabel di MySQL setiap kali ada perubahan struktur data? Tambah kolom satu, migration dulu, update semua query, dan tiba-tiba semuanya error. Nyebelin banget, kan? Nah, di sinilah Node.js MongoDB hadir sebagai angin segar. MongoDB menyimpan data dalam format dokumen JSON yang fleksibel — nggak ada tabel, nggak ada kolom kaku, nggak ada drama migration.
Di artikel ke-9 dari Seri Belajar Node.js ini, kamu akan belajar cara koneksi ke MongoDB, melakukan operasi CRUD MongoDB Node.js dari nol, sampai pakai Mongoose ODM untuk membuat kode yang lebih terstruktur dan elegan. Siap? Kita mulai!
MongoDB = Database berbasis Dokumen JSON
MongoDB bukan database relasional. Data disimpan sebagai dokumen BSON (Binary JSON) di dalam collection — bayangkan seperti folder berisi file JSON. Setiap dokumen bisa punya struktur berbeda tanpa perlu mendefinisikan schema terlebih dahulu.
Kenapa Node.js MongoDB Jadi Kombinasi Favorit Developer?
Bayangkan MongoDB seperti laci arsip yang super fleksibel. Di MySQL, kamu harus bikin laci (tabel) dengan ukuran yang sudah ditentukan sejak awal. Di MongoDB, kamu bisa taruh dokumen apapun ke dalam satu laci — ada yang punya 3 field, ada yang punya 15 field — dan semuanya fine-fine aja.
Node.js dan MongoDB cocok banget karena keduanya "berbicara" dalam JavaScript dan JSON. Data dari frontend, diproses di Node.js, disimpan ke MongoDB — semuanya dalam format yang sama. Tidak ada translasi, tidak ada overhead konversi.
MongoDB adalah database NoSQL paling populer di dunia selama bertahun-tahun berturut-turut, dan digunakan oleh perusahaan seperti Forbes, eBay, Adobe, dan Google. Stack MEAN (MongoDB, Express, Angular, Node.js) dan MERN (dengan React) menjadi blueprint aplikasi modern yang paling banyak dipakai startup.
Koneksi Node.js ke MongoDB dengan Mongoose ODM
Sebelum bisa operasi apapun, kamu perlu koneksi ke MongoDB. Ada dua cara: pakai native MongoDB driver, atau pakai Mongoose ODM (Object Data Modeling). Kita pilih Mongoose karena lebih developer-friendly — ada schema validation, middleware, dan banyak fitur keren lainnya.
Mongoose itu ibarat "penerjemah profesional" antara Node.js dan MongoDB. Kamu define schema-nya, Mongoose yang ngurusin sisanya.
Install Mongoose via npm
Buka terminal di folder project Node.js kamu dan jalankan perintah berikut.
Buat file koneksi db.js
Pisahkan konfigurasi koneksi ke file tersendiri agar kode lebih rapi.
const mongoose = require('mongoose');
const connectDB = async () => {
try {
await mongoose.connect('mongodb://localhost:27017/belajar_nodejs');
console.log('✅ MongoDB terhubung!');
} catch (error) {
console.error('❌ Gagal koneksi:', error.message);
process.exit(1);
}
};
module.exports = connectDB;
Buat Schema & Model dengan Mongoose
Schema adalah "blueprint" dokumen MongoDB kamu. Di sini kita buat model Produk sebagai contoh.
const mongoose = require('mongoose');
const produkSchema = new mongoose.Schema({
nama: { type: String, required: true },
harga: { type: Number, required: true },
stok: { type: Number, default: 0 },
kategori: String,
createdAt: { type: Date, default: Date.now }
});
module.exports = mongoose.model('Produk', produkSchema);
Untuk project produksi, simpan URI MongoDB di file .env dan akses via process.env.MONGO_URI. Jangan pernah hardcode credential di kode — ini kebiasaan profesional yang wajib kamu tanamkan dari sekarang!
Operasi CRUD MongoDB Node.js: Create, Read, Update, Delete
Inilah jantung dari semua aplikasi database — operasi CRUD. Dengan Mongoose, setiap operasi terasa intuitif dan mirip JavaScript biasa. Mari kita bedah satu per satu.
Semua operasi Mongoose bersifat asynchronous — selalu gunakan async/await atau .then()/.catch(). Kode yang tidak menangani async dengan benar adalah sumber bug paling umum bagi pemula.
CREATE — Tambah Data Baru
// Cara 1: new + save()
const produkBaru = new Produk({
nama: 'Laptop Gaming',
harga: 15000000,
stok: 10,
kategori: 'Elektronik'
});
await produkBaru.save();
// Cara 2: create() — lebih ringkas
const produk = await Produk.create({
nama: 'Mouse Wireless', harga: 350000
});
READ — Ambil Data dari Database
const semuaProduk = await Produk.find();
// Cari berdasarkan kondisi
const elektronik = await Produk.find({ kategori: 'Elektronik' });
// Ambil satu dokumen berdasarkan ID
const satuproduk = await Produk.findById('60d5ec49...');
// Filter harga, sort, dan limit
const mahal = await Produk
.find({ harga: { $gte: 1000000 } })
.sort({ harga: -1 })
.limit(5);
UPDATE — Perbarui Data yang Ada
await Produk.findByIdAndUpdate(
'60d5ec49...',
{ $set: { harga: 14500000, stok: 8 } },
{ new: true } // kembalikan dokumen setelah update
);
// Update banyak dokumen sekaligus
await Produk.updateMany(
{ kategori: 'Elektronik' },
{ $inc: { harga: 50000 } } // naikkan harga 50rb
);
DELETE — Hapus Data dari Database
await Produk.findByIdAndDelete('60d5ec49...');
// Hapus berdasarkan kondisi
await Produk.deleteMany({ stok: 0 });
// Hapus satu dokumen berdasarkan filter
await Produk.deleteOne({ nama: 'Mouse Wireless' });
Hati-hati dengan deleteMany({}) tanpa filter — ini akan menghapus semua dokumen dalam collection! Selalu double-check kondisi filter sebelum menjalankan perintah delete atau update massal.
Mengapa Mongoose ODM Lebih Direkomendasikan untuk Node.js?
Kamu mungkin bertanya — kalau MongoDB sudah punya native driver sendiri (mongodb npm package), kenapa masih perlu Mongoose? Jawabannya sederhana: Mongoose ODM menambahkan lapisan abstraksi yang membuat hidup kamu jauh lebih mudah, terutama di project yang besar dan kompleks.
🔍 Analisis: Mongoose vs MongoDB Native Driver
- Kontrol penuh, performa optimal
- Tidak ada schema validation bawaan
- Tidak ada middleware/hooks
- Cocok untuk use case sangat spesifik
- Kode lebih verbose dan manual
- Schema validation otomatis
- Middleware (pre/post hooks) powerful
- Virtual fields & computed properties
- Populate (relasi antar collection)
- API bersih dan developer-friendly
Mongoose punya fitur populate() yang memungkinkan kamu melakukan "join" antar collection — sesuatu yang perlu ditulis manual di native driver. Selain itu, pre/post hooks memungkinkan kamu menjalankan fungsi otomatis sebelum atau sesudah operasi save, find, delete, dll. — sempurna untuk hashing password sebelum disimpan!
userSchema.pre('save', async function(next) {
if (this.isModified('password')) {
this.password = await bcrypt.hash(this.password, 10);
}
next();
});
Seri Belajar Node.js: Node.js from Zero to Zorro
Artikel ini adalah bagian ke-9 dari 16 artikel seri lengkap belajar Node.js dari nol hingga mahir. Cek daftar isi lengkapnya di sini:
📖 Lihat Daftar Isi Lengkap →
No comments:
Post a Comment