MongoDB Academy · Ders

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.

1. ders / 413 adım

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.

Başlamak ücretsiz

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

  1. Resmî Node.js Sürücüsüyle Bağlanma
  2. Mongoose Şemaları, Modelleri ve Sanal Özellikleri
  3. Mongoose Sorguları, Zincirleme ve Lean Belgeler
  4. Mongoose Ara Katmanı: Önce ve Sonra Kancaları
← MongoDB Academy Sayfasına Dön