Menu

MongoDB dengan Node.js: Contoh Driver (find, insert, update)

Pakai MongoDB dari Node.js dengan driver resmi mongodb: hubungkan dengan MongoClient, lalu insert, find, update, dan delete dokumen di sebuah collection, semuanya dengan async/await.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Untuk memakai MongoDB dari Node.js, install driver resminya (npm install mongodb), hubungkan dengan new MongoClient(uri), pilih database dengan client.db('name') dan collection dengan db.collection('name'). Setiap operasi (insertOne, find, updateOne, deleteOne) mengembalikan promise, jadi kamu meng-await-nya. Dokumen masuk dan keluar sebagai object JavaScript biasa.

Hasilnya [ 'Dune', 'Neuromancer', 'Hyperion' ]. Database shop dan collection books belum ada sebelumnya: MongoDB membuatnya saat insert pertama, dan toArray() memuat setiap dokumen yang ditunjuk cursor find().

Mencari dokumen dengan filter dan projection

Filter adalah object yang menggambarkan dokumen yang kamu inginkan. Nilai biasa dicocokkan persis; operator seperti $gt, $lt, $in, dan $regex ditaruh di object bersarang. projection di argumen kedua memilih field mana yang dikembalikan.

recent berisi dua buku terbaru setelah 1960, Hyperion lalu Neuromancer, hanya dengan title dan year; findOne mengembalikan kecocokan pertama (atau null), dan countDocuments menghitung 2 buku yang harganya 10 atau lebih. Ganti $gt: 1960 menjadi $gt: 1985 dan hanya Hyperion yang tersisa.

Update dan delete

updateOne(filter, update) mengubah dokumen pertama yang cocok. Update-nya memakai operator: $set mengganti field, $inc menambah angka, $unset menghapus field, dan $push menambah ke array. updateMany dan deleteMany bekerja pada setiap dokumen yang cocok.

Update-nya cocok dengan satu dokumen dan mengubahnya, jadi Dune sekarang berharga 10 dengan stok 2, dan menghapus buku yang stoknya habis menyisakan 1. Update harus memakai operator: berikan { price: 10 } tanpa $set dan driver menolaknya (replaceOne adalah panggilan untuk mengganti seluruh dokumen).

ObjectId dan index

Setiap dokumen mendapat _id; kalau kamu tidak mengaturnya, driver membuat sebuah ObjectId. Untuk mencari dokumen berdasarkan id yang datang sebagai string (misalnya dari URL), bungkus dengan new ObjectId(id). Index membuat pencarian pada sebuah field menjadi cepat, dan unique index membuat MongoDB menolak duplikat.

Sebagai string, ObjectId terdiri dari 24 karakter hex, dan mencari dengan string biasa tidak menemukan apa pun, jadi baris itu mencetak null. Insert kedua melanggar unique index dan gagal dengan kode 11000, begitulah cara kamu mendeteksi "email sudah dipakai".

Memakai MongoDB di API Express

Hubungkan sekali saat server dimulai dan bagikan collection-nya; jangan membuka koneksi baru per request. Driver menyimpan pool koneksi dan memakainya ulang.

GET /books mengembalikan kedua buku, masing-masing dengan _id. Salin satu id ke GET /books/<id> untuk mengambil satu buku, atau kirim POST /books dengan body JSON seperti {"title": "Foundation", "year": 1951} lalu tampilkan daftar bukunya lagi.

Aplikasi sungguhan membaca connection string dari process.env.MONGODB_URI, bukan menuliskannya di kode.

Kalau kamu ingin schema dan validasi di atas driver, Mongoose (npm install mongoose) membungkusnya:

const Book = mongoose.model('Book', new mongoose.Schema({ title: String, year: Number }));
await Book.create({ title: 'Dune', year: 1965 });

Kesalahan umum

Lupa toArray(). find() mengembalikan cursor, bukan dokumen. Mencetaknya hanya menampilkan object cursor; panggil toArray(), atau ulangi dengan for await.

Membuat koneksi di setiap request. Setiap new MongoClient membuka pool-nya sendiri. Buat satu client saat startup dan pakai ulang di mana saja.

Tidak pernah menutup client di script. Client yang terbuka membuat proses tetap hidup setelah kodemu selesai. Panggil await client.close() di akhir script; server membiarkannya terbuka sepanjang hidupnya.

Pertanyaan yang sering diajukan

Sebaiknya pakai driver mongodb atau Mongoose?

Driver adalah lapisan resmi yang lebih tipis: kamu bekerja dengan object biasa dan bahasa query milik MongoDB sendiri. Mongoose menambahkan schema, validasi, dan model di atasnya, yang membantu saat kamu ingin setiap dokumen dicek. Keduanya berbicara dengan database yang sama, dan Mongoose memakai driver di baliknya.

Apakah aku perlu membuat database atau collection dulu?

Tidak. MongoDB membuat keduanya saat pertama kali kamu meng-insert dokumen ke dalamnya. client.db('shop') dan db.collection('books') hanya mengembalikan handle.

Di mana aku menaruh connection string?

Di environment variable seperti MONGODB_URI, dibaca dengan process.env.MONGODB_URI. String milik database yang di-hosting berisi password, jadi tidak boleh di-commit ke repository.

Kenapa find tidak mengembalikan dokumen saat aku mencari berdasarkan id?

_id disimpan sebagai ObjectId, bukan string, jadi { _id: '65f1...' } tidak cocok dengan apa pun. Ubah dulu: { _id: new ObjectId(id) }.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai