Meta Description: Tutorial MongoDB + Node.js lengkap untuk pemula. Dari setup sampai CRUD, lengkap dengan contoh kode asli dan troubleshooting error yang sering muncul.
Tutorial MongoDB + Node.js untuk Pemula: Dari Nol Sampai Bisa CRUD
Dulu, pertama kali aku coba pakai MongoDB bareng Node.js, rasanya pengin lempar laptop. Kenapa? Karena semua tutorial yang aku baca terlalu “sempurna” — kodenya jalan di penulisnya, tapi begitu aku coba, error di mana-mana. Koneksi gagal, collection nggak ketemu, data nggak masuk. Jam 2 pagi cuma buat debug masalah yang ternyata cuman salah satu huruf di connection string.
Artikel ini aku tulis supaya kamu nggak ngalamin hal yang sama. Aku bakal share cara setup MongoDB + Node.js yang beneran works, lengkap dengan error-error bodoh yang pernah aku alamin dan cara ngatasinnya. Skip the theory yang bikin ngantuk, langsung praktik.
Dulu Aku Bingung Banget: SQL vs NoSQL, Harus Pilih Mana?
Sebelum masuk ke koding, cerita dulu kenapa aku akhirnya pilih MongoDB.
Aku dulu udah familiar sama SQL — bikin tabel, relasi, JOIN, itu udah jadi makanan sehari-hari. Tapi pas mulai bikin project yang datanya fleksibel (misal: user profile yang field-nya beda-beda tiap user), SQL bikin aku frustasi. Mau nambah kolom? ALTER TABLE. Mau nyimpen nested data? Harus bikin tabel baru buat relasi.
Kemudian temenku ngenalin MongoDB. Awalnya skeptis — “database tanpa tabel? aneh.” Tapi begitu nyoba, ternyata konsepnya masuk akal banget. Data disimpen dalam format JSON (atau tepatnya BSON), jadi langsung nyambung sama Node.js yang emang berbasis JavaScript.
Kalau kamu udah ngerti SQL, bagus. Tapi jangan paksa cara berpikir SQL ke MongoDB. Ini beda filosofi. Kalau belum familiar sama SQL sama sekali, baca dulu belajar SQL dasar biar punya perbandingan.
Kapan pakai MongoDB?
- Data kamu berubah-ubah strukturnya
- Kamu butuh simpen data nested/complex
- Project kamu pakai JavaScript full-stack
- Kamu butuh scaling horizontal
Kapan jangan pakai MongoDB?
- Data kamu highly relational (banyak JOIN)
- Butuh transaksi ACID yang ketat (banking, e-commerce checkout)
Persiapan: Apa yang Perlu Kamu Install
Sebelum mulai koding, pastiin kamu udah install ini:
1. Node.js (versi 18+) Download dari nodejs.org. Pilih LTS version. Setup-nya ~5 menit.
2. MongoDB Dua opsi:
- MongoDB Atlas (cloud, GRATIS): Paling gampang buat pemula. Buka mongodb.com/atlas, buat akun, bikin free cluster. ~10 menit setup.
- MongoDB Lokal: Download MongoDB Community Server, install di komputer. Butuh ~20 menit setup dan konfigurasi.
Aku saranin pakai MongoDB Atlas dulu. Kenapa? Karena dulu aku install MongoDB lokal, ternyata service-nya nggak auto-start di Windows, dan aku buang 1 jam cuma buat nyari tahu kenapa mongod command nggak jalan. Atlas langsung ready, nggak perlu pusing.
3. MongoDB Compass (optional tapi recommended) Ini GUI buat ngeliat database kamu secara visual. Download gratis dari mongodb.com/products/compass. Bantu banget buat debug — kadang data udah masuk tapi kamu nggak sadar karena cuma ngecek di terminal.
Step-by-Step: Bikin Project Node.js + MongoDB dari Nol
Oke, sekarang kita mulai praktik. Ini step yang aku pakai di setiap project.
Step 1: Init Project
Buat folder baru, buka terminal:
mkdir belajar-mongo
cd belajar-mongo
npm init -y
### Step 2: Install Dependencies
```bash
npm install mongodb
Atau kalau kamu mau pakai Mongoose (ODM yang bikin hidup lebih gampang):
```bash
npm install mongoose
Aku saranin mulai dari driver native `mongodb` dulu biar ngerti cara kerjanya. Nanti kalau udah paham, baru switch ke Mongoose.
### Step 3: Koneksi ke MongoDB
Buat file `koneksi.js`:
```javascript
const { MongoClient } = require('mongodb');
// Ganti dengan connection string kamu dari Atlas
const uri = "mongodb+srv://username:[email protected]/?retryWrites=true&w=majority";
const client = new MongoClient(uri);
async function main() {
try {
await client.connect();
console.log("Berhasil koneksi ke MongoDB!");
// Test: ambil info database
const databasesList = await client.db().admin().listDatabases();
console.log("Databases:");
databasesList.databases.forEach(db => console.log(` - ${db.name}`));
} catch (e) {
console.error("Gagal koneksi:", e);
} finally {
await client.close();
}
}
main();
Jalankan:
```bash
node koneksi.js
**Error yang pernah aku alamin di sini:**
MongoServerSelectionError: connect ECONNREFUSED
Kalau pakai Atlas dan muncul error ini, 99% karena:
1. IP kamu belum di-whitelist di Atlas. Masuk ke **Network Access** → **Add IP Address** → pilih "Allow Access from Anywhere" (buat development).
2. Username/password salah di connection string.
Aku pernah buang 2 jam karena ternyata password-ku ada karakter `@` yang belum di-encode. Password di URL harus di-encode! Contoh: kalau password `p@ss123`, jadi `p%40ss123`.
### Step 4: CRUD — Create, Read, Update, Delete
Ini bagian inti. Buat file `crud.js`:
```javascript
const { MongoClient } = require('mongodb');
const uri = "mongodb+srv://username:[email protected]/?retryWrites=true&w=majority";
const client = new MongoClient(uri);
async function main() {
try {
await client.connect();
const db = client.db("toko_online");
const produk = db.collection("produk");
// ========== CREATE ==========
// Insert satu dokumen
const insertResult = await produk.insertOne({
nama: "Laptop ASUS",
harga: 8500000,
stok: 15,
kategori: "elektronik",
tags: ["laptop", "asus", "gaming"]
});
console.log("Inserted ID:", insertResult.insertedId);
// Insert banyak sekaligus
const insertManyResult = await produk.insertMany([
{ nama: "Keyboard Mechanical", harga: 350000, stok: 50, kategori: "aksesoris" },
{ nama: "Mouse Logitech", harga: 150000, stok: 100, kategori: "aksesoris" },
{ nama: "Monitor LG 24 inch", harga: 2500000, stok: 20, kategori: "elektronik" }
]);
console.log(`Inserted ${insertManyResult.insertedCount} dokumen`);
// ========== READ ==========
// Ambil semua data
const semuaProduk = await produk.find({}).toArray();
console.log("\nSemua produk:", semuaProduk);
// Filter: harga di bawah 1 juta
const murah = await produk.find({ harga: { $lt: 1000000 } }).toArray();
console.log("\nProduk murah:", murah);
// Cari satu
const laptop = await produk.findOne({ nama: "Laptop ASUS" });
console.log("\nLaptop:", laptop);
// ========== UPDATE ==========
const updateResult = await produk.updateOne(
{ nama: "Laptop ASUS" },
{ $set: { harga: 7999000, stok: 12 } }
);
console.log(`\nUpdated ${updateResult.modifiedCount} dokumen`);
// Update banyak
const updateManyResult = await produk.updateMany(
{ kategori: "aksesoris" },
{ $set: { diskon: 10 } }
);
console.log(`Updated ${updateManyResult.modifiedCount} aksesoris dengan diskon`);
// ========== DELETE ==========
const deleteResult = await produk.deleteOne({ nama: "Mouse Logitech" });
console.log(`\nDeleted ${deleteResult.deletedCount} dokumen`);
} catch (e) {
console.error("Error:", e);
} finally {
await client.close();
}
}
main();
Jalankan:
```bash
node crud.js
Kalau semua beres, output-nya bakal nunjukin data yang di-insert, di-update, dan di-delete. Buka **MongoDB Compass** buat verify — connect pakai connection string yang sama, dan kamu bisa lihat database `toko_online` dengan collection `produk`.
### Step 5: Membuat Index (Penting untuk Performa!)
Ini yang sering dilewatin pemula. Tanpa index, MongoDB harus scan semua dokumen buat nyari data. Bayangin kayak cari buku di perpustakaan tanpa katalog — capek.
```javascript
// Buat index di field "nama"
await produk.createIndex({ nama: 1 });
// Buat index untuk pencarian text
await produk.createIndex({ nama: "text", tags: "text" });
## Tips dari Pengalaman: Yang Nggak Ditulis di Tutorial Lain
### 1. Jangan Pernah Hardcode Connection String
Aku pernah ngirim source code ke temen, lupa ganti connection string yang ada password-nya. Untung private repo. Sejak itu, selalu pakai `.env`:
```bash
npm install dotenv
Buat file `.env`:
MONGODB_URI=mongodb+srv://username:[email protected]/
DB_NAME=toko_online
Di kode:
```javascript
require('dotenv').config();
const uri = process.env.MONGODB_URI;
Dan **jangan lupa** tambahin `.env` ke `.gitignore`.
### 2. Selalu Pakai try-catch
Aku dulu males pakai try-catch, ujung-ujungnya app crash tanpa pesan error yang jelas. MongoDB operations bisa gagal kapan aja — koneksi putus, timeout, duplicate key. Selalu wrap dalam try-catch.
### 3. Pakai Connection Pooling
Jangan buka-tutup koneksi di setiap query. Pakai satu client instance dan reuse. Kode di atas udah bener — kita bikin satu `MongoClient` di awal. Kalau kamu pakai Express.js, bikin koneksi sekali di startup dan share ke semua routes.
### 4. Schema Validation
Satu kelemahan MongoDB: nggak ada schema yang dipaksain. Kamu bisa insert dokumen kosong. Buat production, tambahin validation:
```javascript
await db.createCollection("produk", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["nama", "harga"],
properties: {
nama: { bsonType: "string", description: "Harus berupa string" },
harga: { bsonType: "number", minimum: 0, description: "Harus angka positif" }
}
}
}
});
## MongoDB Native Driver vs Mongoose: Pilih Mana?
Ini pertanyaan yang sering muncul.
| | **MongoDB Native** | **Mongoose** |
|---|---|---|
| Ukuran | Ringan | Lebih berat |
| Schema | Tidak ada | Ada (bisa dipaksain) |
| Learning curve | Lebih tinggi | Lebih mudah |
| Flexibility | Full | Terbatas (tapi lebih aman) |
| Cocok untuk | Simple apps, microservices | Medium-large apps |
**Saran aku:** kalau baru mulai, pakai **native driver** dulu buat ngerti dasarnya. Begitu project mulai besar dan kamu butuh schema validation + middleware, switch ke **Mongoose**. Aku di project pertama langsung pakai Mongoose dan nggak ngerti apa yang terjadi di balik layar. Bikin susah debug.
Kalau kamu mau belajar lebih lanjut tentang automation dan integrasi database ke workflow, baca juga [belajar Python automation](https://dovi.my.id/tutorial/belajar-python-automation/) — kadang pakai Python buat migrasi data lebih cepat.
## Troubleshooting Masalah Umum
### `MongoParseError: Invalid connection string`
Cek URI-nya. Pastiin nggak ada spasi, dan karakter khusus di username/password udah di-encode.
### `MongoServerError: bad auth Authentication failed`
Username atau password salah. Buka Atlas → Database Access → cek credential. Reset password kalau perlu.
### Data nggak muncul di Atlas tapi nggak ada error
Kemungkinan kamu connect ke database lokal, bukan Atlas. Cek connection string — pastiin pakai `mongodb+srv://...` bukan `mongodb://localhost...`.
### `ECONNREFUSED` di MongoDB lokal
Service belum jalan. Di Windows, buka Services → cari "MongoDB Server" → Start. Di Mac/Linux: `brew services start mongodb-community` atau `sudo systemctl start mongod`.
### Insert berhasil tapi data kosong
Kamu mungkin nge-cek di database/collection yang salah. Cek nama database di code vs di Compass.
Kalau kamu berencana deploy ke Docker, baca dulu [belajar Docker untuk pemula](https://dovi.my.id/tutorial/belajar-docker-pemula-2025/) — nanti MongoDB bisa di-containerize juga.
## FAQ: Pertanyaan yang Sering Ditanya
**1. MongoDB itu gratis?**
Ya. MongoDB Community Edition dan MongoDB Atlas free tier (512 MB) sepenuhnya gratis. Cukup buat akun di mongodb.com.
**2. Berapa lama belajar MongoDB + Node.js dari nol?**
Kalau kamu udah ngerti JavaScript dasar, 2-3 hari udah bisa bikin CRUD sederhana. Kalau belum, pelajari dulu [belajar SQL dasar](https://dovi.my.id/tutorial/belajar-sql-dasar/) buat punya fondasi database.
**3. MongoDB cocok untuk project apa?**
Blog, e-commerce catalog, user profiles, IoT data, real-time apps. Kurang cocok buat sistem keuangan yang butuh transaksi ketat.
**4. Bedanya BSON dan JSON?**
BSON (Binary JSON) itu format binary yang dipakai MongoDB secara internal. Lebih cepat dibaca/mesin dan support tipe data lebih banyak (Date, ObjectId, dll). Kamu nggak perlu pusing — di kode, kamu pakai format JSON biasa.
**5. Berapa banyak data yang bisa ditampung MongoDB Atlas free tier?**
512 MB. Cukup buat development dan testing. Kalau udah production, upgrade ke shared cluster (~$9/bulan).
**6. Bisa pakai MongoDB tanpa Node.js?**
Bisa. MongoDB support Python, Java, Go, C#, dan banyak bahasa lain. Tapi kalau full-stack JavaScript, Node.js + MongoDB itu kombinasi paling natural.
**7. Apa itu replica set?**
Salinan database di beberapa server. Kalau satu server mati, yang lain ngambil alih. Di Atlas free tier, ini udah disediain otomatis.
## Penutup
**MongoDB** + Node.js itu kombinasi yang powerful banget buat full-stack development. Dari pengalaman aku, belajar curve-nya nggak setajam yang aku bayangin — yang bikin susah itu justru hal-hal kecil yang nggak ditulis di tutorial: connection string yang salah satu huruf, IP belum di-whitelist, service nggak jalan.
Mulai dari yang sederhana: bikin koneksi, CRUD, terus naikin bertahap. Nggak perlu langsung bikin architecture yang kompleks. Kalau kamu juga tertarik bikin REST API-nya, konsep yang kamu pelajari di sini bakal langsung nyambung — tinggal tambahin Express.js.
Satu hal yang sering aku tekankan: jangan cuma copy-paste kode. Ketik sendiri, jalankan, buat error-nya sendiri, debug sendiri. Itu cara paling cepat buat beneran ngerti.
Kalau ada pertanyaan atau butuh bantuan, langsung email ke [[email protected]](mailto:[email protected])! Aku siap bantu.
---
**Tags:** mongodb, nodejs, database, nosql, backend, tutorial, javascript, crud