Terhubung dengan Driver Node.js Resmi
Peserta didik akan membuat MongoClient, mengelola kumpulan koneksi, dan menjalankan operasi CRUD dari aplikasi Node.js menggunakan driver native.
Terhubung dengan Driver Node.js Resmi adalah pelajaran MongoDB Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar MongoDB Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus MongoDB Academy mencakup 4 pelajaran total.
Bagian dari pelajaran ini belum diterjemahkan dan ditampilkan dalam bahasa Inggris.
The Official MongoDB Node.js Driver
The MongoDB Node.js driver (mongodb npm package) is the official, low-level library for connecting to MongoDB from Node.js applications. It provides direct access to all MongoDB features without an abstraction layer, making it ideal for performance-critical code, microservices, and scripts. The driver is maintained by MongoDB, Inc. and closely tracks new MongoDB server features.
// Install the driver
// npm install mongodb
// Or with yarn:
// yarn add mongodb
// The driver exports MongoClient as its main entry point
const { MongoClient, ObjectId, ServerApiVersion } = require('mongodb');
// or ES module:
// import { MongoClient, ObjectId } from 'mongodb';Creating a MongoClient
The MongoClient class is the entry point for all interactions. Instantiate it with your connection string (URI) and an optional options object. The connection string encodes the host, port, credentials, and connection parameters. For MongoDB Atlas, copy the connection string from the Atlas UI and replace the placeholder password. Create one MongoClient per application and reuse it—do not create a new one per request.
const { MongoClient, ServerApiVersion } = require('mongodb');
const uri = process.env.MONGODB_URI;
// URI format: mongodb+srv://<user>:<password>@cluster0.xxxxx.mongodb.net/?retryWrites=true
const client = new MongoClient(uri, {
serverApi: {
version: ServerApiVersion.v1,
strict: true,
deprecationErrors: true
}
});
// client is not yet connected — connecting happens lazily or via connect()Connecting to MongoDB
Call client.connect() to establish a connection pool. The driver maintains a connection pool—typically 5-100 connections to the server—and reuses them across operations. You only need to call connect() once at application startup. Operations can also be called directly without explicit connect()—the driver connects lazily on the first operation. Call client.close() on application shutdown.
async function main() {
try {
await client.connect();
console.log('Connected to MongoDB');
// Get database reference
const db = client.db('myDatabase');
// Ping the server to verify connection
await db.command({ ping: 1 });
console.log('Ping successful');
// Run your application logic here...
} finally {
// Always close when done
await client.close();
}
}
main().catch(console.error);Singleton Pattern for Web Servers
In a web server (Express, Fastify, NestJS), the MongoClient must be a module-level singleton that is created once on startup and shared by all request handlers. Creating a new MongoClient per request would exhaust available connections and severely degrade performance. The standard pattern is to connect in the server startup function and export the client or db reference.
// db.js — module-level singleton
const { MongoClient } = require('mongodb');
let client;
let db;
async function connectToDatabase() {
if (db) return db; // return existing connection
client = new MongoClient(process.env.MONGODB_URI);
await client.connect();
db = client.db(process.env.DB_NAME || 'myapp');
return db;
}
module.exports = { connectToDatabase };
// In your Express app:
// const { connectToDatabase } = require('./db');
// const db = await connectToDatabase();
// app.locals.db = db;Getting Collection References
Access a collection by calling db.collection('collectionName'). This returns a Collection object without any network call—it is just a reference. You can get collection references at startup and store them as module-level variables, or get them inline within each function. Collection references are lightweight and safe to reuse across requests.
const db = client.db('ecommerce');
// Get collection references
const usersCollection = db.collection('users');
const ordersCollection = db.collection('orders');
const productsCollection = db.collection('products');
// TypeScript: provide a document type for type safety
// const users = db.collection<UserDocument>('users');
// Collections can also be retrieved inline:
async function getUser(id) {
return client.db('ecommerce').collection('users').findOne({ _id: id });
}CRUD Operations: Insert
Insert documents using insertOne() or insertMany(). The driver automatically generates an _id if not provided and returns the inserted IDs. The result object's insertedId (for insertOne) or insertedIds map (for insertMany) let you track what was created. Both operations accept an options object where you can specify writeConcern.
const db = client.db('shop');
const products = db.collection('products');
// Insert one document
const insertResult = await products.insertOne({
name: 'Mechanical Keyboard',
price: 149.99,
category: 'Electronics',
stock: 50
});
console.log('Inserted ID:', insertResult.insertedId);
// Insert multiple documents
const bulkResult = await products.insertMany([
{ name: 'Mouse Pad', price: 19.99, category: 'Accessories' },
{ name: 'USB Hub', price: 39.99, category: 'Electronics' }
]);
console.log('Inserted count:', bulkResult.insertedCount);CRUD Operations: Read
Use findOne(filter) to retrieve a single document or find(filter) to get a cursor over all matching documents. Convert a cursor to an array with .toArray() for small result sets, or iterate with for await...of for large ones. Both methods accept a second options argument for projection, sort, skip, limit, and other query modifiers.
const users = db.collection('users');
// Find a single user by email
const user = await users.findOne(
{ email: 'alice@example.com' },
{ projection: { password: 0 } } // exclude sensitive fields
);
// Find multiple documents with options
const activeUsers = await users.find(
{ active: true, role: 'admin' },
{
projection: { name: 1, email: 1 },
sort: { createdAt: -1 },
limit: 50
}
).toArray();
// Iterate large results without loading all into memory
const cursor = users.find({ active: true });
for await (const user of cursor) {
await processUser(user);
}CRUD Operations: Update
Update documents with updateOne(), updateMany(), or findOneAndUpdate(). The filter selects which documents to update and the update document specifies the changes using operators like $set, $inc, and $push. updateOne() and updateMany() return a result with matchedCount and modifiedCount. Use upsert: true to create the document if it does not exist.
const orders = db.collection('orders');
// Update one order's status
const updateResult = await orders.updateOne(
{ _id: orderId },
{ $set: { status: 'shipped', shippedAt: new Date() } }
);
console.log('Modified:', updateResult.modifiedCount);
// Atomic: find, update, and return the updated document
const updatedOrder = await orders.findOneAndUpdate(
{ _id: orderId },
{ $set: { status: 'delivered' }, $push: { statusHistory: { status: 'delivered', at: new Date() } } },
{ returnDocument: 'after' } // return the document AFTER update
);CRUD Operations: Delete
Delete documents using deleteOne() or deleteMany(). The filter determines which documents to remove. The result contains deletedCount. For safety in production, always test your filter with a find first before running deleteMany—accidentally deleting all documents in a collection is a common and catastrophic mistake. Consider soft deletes (setting a deletedAt field) instead of physical deletion for audit trails.
const sessions = db.collection('sessions');
// Delete one session
const deleteResult = await sessions.deleteOne({ _id: sessionId });
console.log('Deleted:', deleteResult.deletedCount);
// Delete all expired sessions — test filter first!
const thirtyDaysAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000);
// 1. Test: how many would be deleted?
const count = await sessions.countDocuments({ expiresAt: { $lt: thirtyDaysAgo } });
console.log('Would delete:', count);
// 2. Only delete after confirming the count looks right
if (count < 10000) { // sanity check
await sessions.deleteMany({ expiresAt: { $lt: thirtyDaysAgo } });
}Running Aggregation Pipelines
Execute aggregation pipelines using collection.aggregate(pipeline). This returns a cursor that you convert to an array or iterate. Pipeline stages are passed as an array of objects. The driver sends the pipeline to MongoDB's aggregation engine and streams back results. For very large result sets, iterate the cursor directly rather than calling .toArray() to avoid loading everything into memory at once.
const orders = db.collection('orders');
// Revenue report by category
const report = await orders.aggregate([
{ $match: { status: 'completed', createdAt: { $gte: new Date('2024-01-01') } } },
{ $group: { _id: '$category', total: { $sum: '$amount' }, count: { $sum: 1 } } },
{ $sort: { total: -1 } }
]).toArray();
console.log('Revenue report:', report);
// For large aggregations, iterate the cursor:
const cursor = orders.aggregate([...largeComplexPipeline]);
for await (const doc of cursor) {
await writeToReport(doc);
}Connection Pool Configuration
The MongoClient maintains a connection pool that automatically manages connections to the server. Key options: maxPoolSize (maximum connections, default 5 per host), minPoolSize (keep-alive minimum), connectTimeoutMS, and socketTimeoutMS. For high-traffic APIs, increase maxPoolSize but balance it against MongoDB's per-connection memory overhead. Monitor pool utilization using Atlas metrics.
const client = new MongoClient(uri, {
maxPoolSize: 20, // max 20 connections to the server
minPoolSize: 5, // keep at least 5 connections warm
connectTimeoutMS: 5000, // fail fast if can't connect in 5s
socketTimeoutMS: 45000, // idle socket timeout
serverSelectionTimeoutMS: 5000 // how long to wait to find an available server
});Quick Check
Test your understanding of MongoDB & NoSQL Databases concepts from this lesson.
Lesson Recap
In this lesson you learned: create one MongoClient at startup and reuse it as a singleton — never create one per request, get database and collection references with client.db() and db.collection() — these are lightweight object references, and use insertOne/insertMany, findOne/find, updateOne/updateMany/findOneAndUpdate, and deleteOne/deleteMany for CRUD operations. Next up we explore Mongoose schemas, models, and virtuals as a higher-level abstraction over the native driver.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Terhubung dengan Driver Node.js Resmi” gratis?
Ya — teks lengkap “Terhubung dengan Driver Node.js Resmi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus MongoDB Academy, upgrade ke CoddyKit PRO. Kursus MongoDB Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Terhubung dengan Driver Node.js Resmi”?
Peserta didik akan membuat MongoClient, mengelola kumpulan koneksi, dan menjalankan operasi CRUD dari aplikasi Node.js menggunakan driver native. Kamu berlatih MongoDB Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai MongoDB Academy?
Tidak diperlukan pengalaman sebelumnya. MongoDB Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Terhubung dengan Driver Node.js Resmi” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran MongoDB Academy ini?
Ya. Setiap pelajaran MongoDB Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Terhubung dengan Driver Node.js Resmi
- Skema, Model, dan Virtual Mongoose
- Kueri Mongoose, Perangkaian, dan Dokumen Lean
- Middleware Mongoose: Hook Pra dan Pasca