[NODE JS] MongoDB ile CRUD İşlemleri
MongoDB, NoSQL dünyasının en popüler veritabanlarından biri ve Node.js ile birlikte kullanıldığında inanılmaz güçlü bir ikili oluşturuyor. Ben ilk kez MongoDB'yi keşfettiğimde, SQL veritabanlarına alışkın biri olarak biraz şaşırmıştım. Tablolar yerine koleksiyonlar, satırlar yerine dökümanlar... Ama kısa sürede bu yapının ne kadar esnek olduğunu anladım. Özellikle JSON benzeri yapılarla çalışmak, JavaScript geliştiricileri için çok doğal bir deneyim sunuyor.
CRUD işlemleri, herhangi bir veritabanı uygulamasının temelini oluşturur. Create (oluşturma), Read (okuma), Update (güncelleme) ve Delete (silme) — bu dört işlem olmadan bir uygulama düşünmek neredeyse imkânsız. MongoDB'de bu işlemleri gerçekleştirmek için genellikle resmi MongoDB Node.js sürücüsünü veya Mongoose gibi bir ODM (Object Document Mapper) kütüphanesini kullanırız.
Mongoose, MongoDB ile çalışırken şema tanımlamamıza olanak tanır. Bu sayede verilerimizin belirli bir yapıya uymasını sağlayabiliriz. Şema doğrulama, veri tutarlılığını korumamıza yardımcı olur. Ayrıca Mongoose'un sunduğu middleware'ler sayesinde kaydetme öncesi veya sonrası işlemler tanımlayabiliriz. Bu özellik özellikle şifre hashleme gibi işlemlerde çok işe yarıyor.
Veritabanına bağlanma işlemi oldukça basit. mongoose.connect() metoduyla bağlantı kurulur ve bağlantı dizesi olarak MongoDB URI'si verilir. Yerel geliştirme ortamında genellikle mongodb://localhost:27017 adresini kullanırız. Üretim ortamında ise MongoDB Atlas gibi bulut çözümleri tercih edilir. Atlas, ücretsiz katmanıyla küçük projeler için mükemmel bir seçenek.
Döküman oluşturma işlemi, yeni bir model örneği oluşturup save() metodunu çağırmak kadar basit. Alternatif olarak create() statik metodunu da kullanabiliriz. Okuma işlemleri için find(), findOne() ve findById() gibi metodlar mevcuttur. Güncelleme için updateOne(), updateMany() ve findByIdAndUpdate() kullanılır. Silme işlemleri ise deleteOne(), deleteMany() ve findByIdAndDelete() ile yapılır.
Filtreleme ve sorgulama konusunda MongoDB çok güçlü operatörler sunar. $gt, $lt, $gte, $lte gibi karşılaştırma operatörleri, $in, $nin gibi küme operatörleri ve $regex gibi desen eşleme operatörleri en sık kullandıklarımız arasında. Bu operatörleri birleştirerek karmaşık sorgular oluşturabiliriz.
Performans açısından indeksleme çok önemli. Sık sorgulanan alanlara indeks eklemek, sorgu hızını dramatik şekilde artırır. Mongoose'da şema tanımlarken index: true seçeneğiyle veya ayrı bir index tanımıyla indeksler oluşturabiliriz. Bileşik indeksler de karmaşık sorgular için oldukça faydalıdır.
Hata yönetimi de CRUD işlemlerinde göz ardı edilmemeli. try-catch blokları kullanarak olası hataları yakalamak ve kullanıcıya anlamlı mesajlar döndürmek profesyonel bir uygulamanın olmazsa olmazıdır. Mongoose'un validation hataları, cast hataları ve duplicate key hataları en sık karşılaşılan hata türleridir.
JavaScript:
// MongoDB ve Mongoose ile kapsamlı CRUD İşlemleri
const mongoose = require('mongoose');
// Veritabanı bağlantısı
async function veritabaniBaglan() {
try {
await mongoose.connect('mongodb://localhost:27017/egitim_db', {
// Bağlantı seçenekleri
});
console.log('MongoDB bağlantısı başarılı!');
} catch (hata) {
console.error('Bağlantı hatası:', hata.message);
process.exit(1);
}
}
// Kullanıcı şeması tanımlama
const kullaniciSemasi = new mongoose.Schema({
isim: {
type: String,
required: [true, 'İsim alanı zorunludur'],
trim: true,
minlength: [2, 'İsim en az 2 karakter olmalıdır']
},
email: {
type: String,
required: [true, 'E-posta alanı zorunludur'],
unique: true,
lowercase: true,
match: [/^\S+@\S+\.\S+$/, 'Geçerli bir e-posta giriniz']
},
yas: {
type: Number,
min: [0, 'Yaş negatif olamaz'],
max: [150, 'Geçerli bir yaş giriniz']
},
sehir: {
type: String,
default: 'İstanbul'
},
hobiler: [String],
kayitTarihi: {
type: Date,
default: Date.now
},
aktif: {
type: Boolean,
default: true
}
});
// Kaydetme öncesi middleware
kullaniciSemasi.pre('save', function(next) {
console.log(`Kullanıcı kaydediliyor: ${this.isim}`);
next();
});
// Model oluşturma
const Kullanici = mongoose.model('Kullanici', kullaniciSemasi);
// CREATE - Yeni kullanıcı oluşturma
async function kullaniciOlustur() {
try {
// Tek kullanıcı oluşturma
const yeniKullanici = new Kullanici({
isim: 'Ahmet Yılmaz',
email: 'ahmet@ornek.com',
yas: 28,
sehir: 'Ankara',
hobiler: ['yazılım', 'müzik', 'yüzme']
});
const kaydedilen = await yeniKullanici.save();
console.log('Kullanıcı oluşturuldu:', kaydedilen);
// Birden fazla kullanıcı oluşturma
const cokluKullanicilar = await Kullanici.insertMany([
{
isim: 'Elif Demir',
email: 'elif@ornek.com',
yas: 24,
sehir: 'İzmir',
hobiler: ['resim', 'fotoğrafçılık']
},
{
isim: 'Mehmet Özkan',
email: 'mehmet@ornek.com',
yas: 32,
sehir: 'İstanbul',
hobiler: ['spor', 'okuma']
},
{
isim: 'Zeynep Kara',
email: 'zeynep@ornek.com',
yas: 27,
sehir: 'Bursa',
hobiler: ['yoga', 'pişirme', 'seyahat']
}
]);
console.log(`${cokluKullanicilar.length} kullanıcı oluşturuldu`);
} catch (hata) {
if (hata.code === 11000) {
console.error('Bu e-posta adresi zaten kayıtlı!');
} else {
console.error('Oluşturma hatası:', hata.message);
}
}
}
// READ - Kullanıcı okuma işlemleri
async function kullanicilariOku() {
try {
// Tüm kullanıcıları getir
const tumKullanicilar = await Kullanici.find();
console.log('Tüm kullanıcılar:', tumKullanicilar.length);
// Filtreleme ile sorgulama
const gencKullanicilar = await Kullanici.find({
yas: { $lt: 30 },
aktif: true
}).select('isim email yas sehir')
.sort({ yas: 1 })
.limit(10);
console.log('Genç kullanıcılar:', gencKullanicilar);
// Tek kullanıcı bulma
const tekKullanici = await Kullanici.findOne({ email: 'ahmet@ornek.com' });
console.log('Bulunan kullanıcı:', tekKullanici?.isim);
// ID ile bulma
if (tumKullanicilar.length > 0) {
const idIleBulunan = await Kullanici.findById(tumKullanicilar[0]._id);
console.log('ID ile bulunan:', idIleBulunan?.isim);
}
// Sayım işlemi
const toplam = await Kullanici.countDocuments({ aktif: true });
console.log('Aktif kullanıcı sayısı:', toplam);
// Regex ile arama
const aramaSonucu = await Kullanici.find({
isim: { $regex: 'Ahmet', $options: 'i' }
});
console.log('Arama sonuçları:', aramaSonucu.length);
} catch (hata) {
console.error('Okuma hatası:', hata.message);
}
}
// UPDATE - Güncelleme işlemleri
async function kullaniciGuncelle() {
try {
// Tek döküman güncelleme
const guncellenen = await Kullanici.findOneAndUpdate(
{ email: 'ahmet@ornek.com' },
{
$set: { sehir: 'İstanbul', yas: 29 },
$push: { hobiler: 'satranç' }
},
{ new: true, runValidators: true }
);
console.log('Güncellenen kullanıcı:', guncellenen?.isim);
// Çoklu güncelleme
const cokluSonuc = await Kullanici.updateMany(
{ sehir: 'İstanbul' },
{ $set: { aktif: true } }
);
console.log(`${cokluSonuc.modifiedCount} kullanıcı güncellendi`);
// Yaş artırma işlemi
await Kullanici.updateOne(
{ email: 'elif@ornek.com' },
{ $inc: { yas: 1 } }
);
console.log('Yaş güncellendi');
} catch (hata) {
console.error('Güncelleme hatası:', hata.message);
}
}
// DELETE - Silme işlemleri
async function kullaniciSil() {
try {
// Tek döküman silme
const silinen = await Kullanici.findOneAndDelete({
email: 'zeynep@ornek.com'
});
console.log('Silinen kullanıcı:', silinen?.isim);
// Koşullu silme
const silmeSonucu = await Kullanici.deleteMany({
aktif: false,
kayitTarihi: { $lt: new Date('2025-01-01') }
});
console.log(`${silmeSonucu.deletedCount} pasif kullanıcı silindi`);
} catch (hata) {
console.error('Silme hatası:', hata.message);
}
}
// Ana fonksiyon
async function main() {
await veritabaniBaglan();
await kullaniciOlustur();
await kullanicilariOku();
await kullaniciGuncelle();
await kullaniciSil();
await mongoose.connection.close();
console.log('Bağlantı kapatıldı');
}
main();
MongoDB ile CRUD işlemleri, Node.js uygulamalarının temel taşlarından biridir. Bu konuyu iyi öğrenmek, ileriki aşamalarda daha karmaşık veritabanı işlemlerini anlamanızı kolaylaştıracaktır. Özellikle Mongoose'un sunduğu şema doğrulama, middleware ve sorgu oluşturma yetenekleri, üretim ortamında sağlam uygulamalar geliştirmenize büyük katkı sağlar. Pratik yaparak bu kavramları pekiştirmenizi öneririm.
Emeğiniz ve katkınız için teşekkür ederiz!
Konunuz gerekli incelemelerden geçerek onaylandı. Topluluğumuza katkılarınızın devamını bekliyoruz.
İyi forumlar!
Konunuz gerekli incelemelerden geçerek onaylandı. Topluluğumuza katkılarınızın devamını bekliyoruz.
İyi forumlar!

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)
Benzer konular
- Cevaplar
- 1
- Görüntüleme
- 36
- Cevaplar
- 9
- Görüntüleme
- 472
Altın Konu
Next.js'de API Oluşturma Ve Kullanma
- Cevaplar
- 12
- Görüntüleme
- 1K
- Cevaplar
- 4
- Görüntüleme
- 2K