Resmî Node.js Sürücüsüyle Bağlanma
Öğrenenler, bir MongoClient oluşturacak, bağlantı havuzunu yönetecek ve yerel sürücüyü kullanarak bir Node.js uygulamasından CRUD işlemleri çalıştıracaklardır.
Resmî Node.js Sürücüsüyle Bağlanma, CoddyKit'te ücretsiz bir MongoDB Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, MongoDB Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. MongoDB Academy kursu toplamda 4 dersten oluşur.
Resmi MongoDB Node.js Sürücüsü
MongoDB Node.js sürücüsü (mongodb npm paketi), Node.js uygulamalarından MongoDB'ye bağlanmak için kullanılan resmi, düşük düzeyli kütüphanedir. Herhangi bir soyutlama katmanı olmadan tüm MongoDB özelliklerine doğrudan erişim sağlar; bu da onu performansın kritik olduğu kodlar, mikro hizmetler ve betikler için ideal kılar. Sürücünün bakımı MongoDB, Inc. tarafından yapılır ve yeni MongoDB sunucusu özelliklerini yakından takip eder.
// 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';MongoClient Oluşturma
MongoClient sınıfı, tüm etkileşimler için giriş noktasıdır. İstemciyi bağlantı dizesi (URI) ve isteğe bağlı bir seçenekler nesnesiyle örnekleyin. Bağlantı dizesi ana bilgisayar, bağlantı noktası, kimlik bilgileri ve bağlantı parametrelerini kodlar. MongoDB Atlas için bağlantı dizesini Atlas arayüzünden kopyalayın ve yer tutucu parolayı değiştirin. Uygulama başına bir MongoClient oluşturup bunu yeniden kullanın; her istek için yeni bir tane oluşturmayın.
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()MongoDB'ye Bağlanma
Bağlantı havuzu oluşturmak için client.connect() çağrısını yapın. Sürücü bir bağlantı havuzunu (genellikle sunucuya 5-100 bağlantı) yönetir ve bu bağlantıları işlemler arasında yeniden kullanır. connect() çağrısını yalnızca uygulama başlatılırken bir kez yapmanız gerekir. İşlemler, açıkça connect() çağırmadan da doğrudan gerçekleştirilebilir; sürücü ilk işlemde tembel olarak bağlanır. Uygulama kapanırken client.close() çağrısını yapın.
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);Web Sunucuları için Singleton Deseni
Bir web sunucusunda (Express, Fastify, NestJS) MongoClient, başlangıçta bir kez oluşturulan ve tüm istek işleyicileri tarafından paylaşılan modül düzeyinde bir singleton olmalıdır. Her istek için yeni bir MongoClient oluşturmak, kullanılabilir bağlantıları tüketir ve performansı ciddi ölçüde düşürür. Standart yaklaşım, sunucunun başlatma işlevinde bağlanmak ve istemciyi veya db başvurusunu dışa aktarmaktır.
// 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;Koleksiyon Başvurularını Alma
db.collection('collectionName') çağrısını yaparak bir koleksiyona erişin. Bu, herhangi bir ağ çağrısı gerçekleştirmeden bir Collection nesnesi döndürür; yalnızca bir başvurudur. Koleksiyon başvurularını başlangıçta alıp modül düzeyindeki değişkenler olarak saklayabilir veya her işlev içinde satır içi olarak alabilirsiniz. Koleksiyon başvuruları hafiftir ve istekler arasında güvenle yeniden kullanılabilir.
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 İşlemleri: Ekleme
Belgeleri insertOne() veya insertMany() kullanarak ekleyin. Sürücü, sağlanmamışsa otomatik olarak bir _id oluşturur ve eklenen kimlikleri döndürür. Sonuç nesnesinin insertedId özelliği (insertOne için) veya insertedIds eşlemesi (insertMany için), neyin oluşturulduğunu izlemenizi sağlar. Her iki işlem de writeConcern belirtebileceğiniz bir options nesnesini kabul eder.
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 İşlemleri: Okuma
Tek bir belgeyi almak için findOne(filter), eşleşen tüm belgeler üzerinde bir cursor almak için find(filter) kullanın. Küçük sonuç kümelerinde cursor'ı .toArray() ile bir diziye dönüştürün; büyük kümelerde ise for await...of ile yineleyin. Her iki yöntem de projection, sort, skip, limit ve diğer sorgu değiştiricileri için ikinci bir seçenekler bağımsız değişkenini kabul eder.
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 İşlemleri: Güncelleme
Belgeleri updateOne(), updateMany() veya findOneAndUpdate() ile güncelleyin. Filtre, hangi belgelerin güncelleneceğini seçer; güncelleme belgesi ise $set, $inc ve $push gibi işleçleri kullanarak değişiklikleri belirtir. updateOne() ve updateMany(), matchedCount ve modifiedCount içeren bir sonuç döndürür. Belge mevcut değilse oluşturmak için upsert: true kullanın.
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 İşlemleri: Silme
Belgeleri deleteOne() veya deleteMany() kullanarak silin. Filtre, hangi belgelerin kaldırılacağını belirler. Sonuç deletedCount içerir. Üretim ortamında güvenlik için deleteMany çalıştırmadan önce filtrenizi her zaman bir find ile test edin; bir koleksiyondaki tüm belgeleri yanlışlıkla silmek yaygın ve felaketle sonuçlanabilecek bir hatadır. Denetim kayıtları için fiziksel silme yerine geçici silmeyi (bir deletedAt alanı ayarlamayı) değerlendirin.
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 } });
}Toplama İşlem Hatlarını Çalıştırma
Toplama işlem hatlarını collection.aggregate(pipeline) kullanarak çalıştırın. Bu, diziye dönüştürebileceğiniz veya üzerinde yineleme yapabileceğiniz bir cursor döndürür. İşlem hattı aşamaları nesne dizisi olarak aktarılır. Sürücü, işlem hattını MongoDB'nin toplama altyapısına gönderir ve sonuçları akış olarak geri alır. Çok büyük sonuç kümelerinde her şeyi aynı anda belleğe yüklememek için .toArray() çağırmak yerine cursor üzerinde doğrudan yineleme yapın.
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);
}Bağlantı Havuzu Yapılandırması
MongoClient, sunucu bağlantılarını otomatik olarak yöneten bir bağlantı havuzunu korur. Önemli seçenekler şunlardır: maxPoolSize (en fazla bağlantı sayısı, ana bilgisayar başına varsayılan 5), minPoolSize (canlı tutulan en düşük bağlantı sayısı), connectTimeoutMS ve socketTimeoutMS. Yoğun trafikli API'lerde maxPoolSize değerini artırın; ancak bunu MongoDB'nin bağlantı başına bellek yüküyle dengeleyin. Havuz kullanımını Atlas ölçümlerini kullanarak izleyin.
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
});Kısa Kontrol
Bu derste ele alınan MongoDB ve NoSQL Veritabanları kavramlarını anlayıp anlamadığınızı test edin.
Ders Özeti
Bu derste şunları öğrendiniz: başlangıçta bir MongoClient oluşturup singleton olarak yeniden kullanın; hiçbir zaman her istek için bir tane oluşturmayın; client.db() ve db.collection() ile veritabanı ve koleksiyon başvuruları alın; bunlar hafif nesne başvurularıdır; ayrıca CRUD işlemleri için insertOne/insertMany, findOne/find, updateOne/updateMany/findOneAndUpdate ve deleteOne/deleteMany kullanın. Sırada, yerel sürücünün üzerinde daha üst düzey bir soyutlama olarak Mongoose şemalarını, modellerini ve sanal alanlarını inceleyeceğiz.
Yapay zeka eğitmeniyle JavaScript öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 30
- Dersler
- 120
Sıkça Sorulan Sorular
“Resmî Node.js Sürücüsüyle Bağlanma” dersi ücretsiz mi?
Evet — “Resmî Node.js Sürücüsüyle Bağlanma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve MongoDB Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. MongoDB Academy kursu toplamda 4 dersten oluşur.
“Resmî Node.js Sürücüsüyle Bağlanma” dersinde ne öğreneceğim?
Öğrenenler, bir MongoClient oluşturacak, bağlantı havuzunu yönetecek ve yerel sürücüyü kullanarak bir Node.js uygulamasından CRUD işlemleri çalıştıracaklardır. MongoDB Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
MongoDB Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te MongoDB Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“Resmî Node.js Sürücüsüyle Bağlanma” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu MongoDB Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her MongoDB Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Resmî Node.js Sürücüsüyle Bağlanma
- Mongoose Şemaları, Modelleri ve Sanal Özellikleri
- Mongoose Sorguları, Zincirleme ve Lean Belgeler
- Mongoose Ara Katmanı: Önce ve Sonra Kancaları