Veritabanı & DevOps

MongoDB ile NoSQL: Ne Zaman Kullanmalı?

Fatih Algül
21.03.2026 271 görüntülenme

MongoDB Nedir?

MongoDB, döküman tabanlı (document-oriented) bir NoSQL veritabanıdır. Geleneksel ilişkisel veritabanlarının (RDBMS) aksine, verileri tablolar ve satırlar yerine JSON benzeri BSON (Binary JSON) dökümanları olarak saklar. 2009 yılında piyasaya sürülen MongoDB, bugün dünyanın en popüler NoSQL veritabanlarından biri haline gelmiştir.

MongoDB'nin temel yapı taşları şunlardır:

  • Database: Koleksiyonları barındıran en üst düzey yapı
  • Collection: İlişkisel veritabanlarındaki tablolara karşılık gelir
  • Document: Satırlara karşılık gelen, esnek şemalı JSON dökümanları
  • Field: Sütunlara karşılık gelen anahtar-değer çiftleri

MongoDB vs İlişkisel Veritabanları

MongoDB ile PostgreSQL veya MySQL gibi ilişkisel veritabanları arasındaki farkları anlamak, doğru teknoloji seçimi için kritik öneme sahiptir.

Şema Esnekliği

İlişkisel veritabanlarında şema önceden tanımlanmalıdır ve her satır aynı sütunlara sahip olmak zorundadır. MongoDB'de ise aynı koleksiyondaki dökümanlar birbirinden tamamen farklı alanlara sahip olabilir:

// Aynı koleksiyondaki iki farklı döküman
// Döküman 1: Bir elektronik ürün
{
  "_id": ObjectId("64a1b2c3d4e5f6a7b8c9d0e1"),
  "ad": "Laptop Pro 15",
  "kategori": "elektronik",
  "fiyat": 45999.99,
  "ozellikler": {
    "ram": "16GB",
    "depolama": "512GB SSD",
    "islemci": "Intel i7-13700H"
  },
  "renk_secenekleri": ["gümüş", "siyah"]
}

// Döküman 2: Bir giyim ürünü
{
  "_id": ObjectId("64a1b2c3d4e5f6a7b8c9d0e2"),
  "ad": "Kış Montu",
  "kategori": "giyim",
  "fiyat": 2499.90,
  "bedenler": ["S", "M", "L", "XL"],
  "malzeme": "polyester",
  "su_gecirmez": true
}

Gördüğünüz gibi her iki döküman aynı koleksiyonda yer almasına rağmen tamamen farklı alanlara sahiptir. Bu esneklik, hızlı geliştirme döngüleri ve değişken veri yapıları için büyük avantaj sağlar.

Ölçekleme Yaklaşımı

İlişkisel veritabanları genellikle dikey ölçekleme (daha güçlü donanım) ile büyütülür. MongoDB ise yatay ölçekleme (sharding) için tasarlanmıştır. Verilerinizi birden fazla sunucuya dağıtarak kapasiteyi artırabilirsiniz. Bu, özellikle büyük veri hacimleriyle çalışırken maliyet ve performans açısından ciddi fark yaratır.

MongoDB'yi Ne Zaman Kullanmalısınız?

MongoDB her proje için doğru seçim değildir. Ancak bazı senaryolarda açık bir avantaj sunar:

1. Hızlı Prototipleme ve MVP Geliştirme

Şema tanımlamadan hızlıca veri yazmaya başlayabilirsiniz. Startuplar ve MVP aşamasındaki projeler için bu esneklik, geliştirme hızını önemli ölçüde artırır. Veri modeliniz henüz oturmamışken sürekli migration yazmak zorunda kalmazsınız.

2. İçerik Yönetim Sistemleri (CMS)

Her içerik tipinin farklı alanlara sahip olduğu CMS projelerinde MongoDB doğal bir seçimdir. Blog yazıları, ürün sayfaları, portföy öğeleri gibi farklı yapıdaki içerikler tek bir koleksiyonda esnek şekilde yönetilebilir.

3. Gerçek Zamanlı Analitik ve Loglama

Yüksek yazma hızı gerektiren loglama ve analitik sistemleri MongoDB'nin güçlü yanlarından biridir. Capped collection yapısı ile boyut sınırlı, otomatik dönen log koleksiyonları oluşturabilirsiniz:

db.createCollection("uygulama_loglari", {
  capped: true,
  size: 5242880,    // 5 MB maksimum boyut
  max: 50000        // Maksimum 50.000 döküman
})

// Log kaydı ekleme
db.uygulama_loglari.insertOne({
  seviye: "ERROR",
  mesaj: "Veritabanı bağlantısı zaman aşımına uğradı",
  servis: "kullanici-api",
  zaman_damgasi: new Date(),
  detay: {
    host: "db-primary-01",
    port: 27017,
    sure_ms: 30000
  }
})

4. IoT ve Zaman Serisi Verileri

Sensörlerden gelen yoğun ve yapısal olarak değişken veriler için MongoDB idealdir. MongoDB 5.0 ile gelen Time Series Collection desteği bu kullanımı daha da güçlendirmiştir:

db.createCollection("sensor_verileri", {
  timeseries: {
    timeField: "zaman_damgasi",
    metaField: "sensor_bilgisi",
    granularity: "seconds"
  }
})

db.sensor_verileri.insertOne({
  sensor_bilgisi: { id: "SICAKLIK-042", konum: "Depo-A" },
  zaman_damgasi: new Date(),
  sicaklik: 23.5,
  nem: 65.2
})

5. E-Ticaret Ürün Katalogları

Farklı kategorilerdeki ürünlerin birbirinden çok farklı özelliklere sahip olduğu e-ticaret sistemlerinde, MongoDB'nin esnek şema yapısı büyük kolaylık sağlar. Bir elektronik ürünün RAM ve işlemci bilgisi varken, bir giyim ürününün beden ve malzeme bilgisi olabilir.

MongoDB'yi Ne Zaman Kullanmamalısınız?

Bazı senaryolarda ilişkisel veritabanları açıkça daha iyi bir tercihtir:

  • Karmaşık ilişkisel veriler: Çok sayıda tablo arasında JOIN gerektiren sorgularınız varsa, ilişkisel veritabanları çok daha verimlidir. MongoDB'de $lookup ile birleştirme yapılabilir ancak performans ve kullanım kolaylığı açısından SQL JOIN'lerin gerisinde kalır.
  • ACID işlem gereksinimleri: Bankacılık, finansal işlemler veya envanter yönetimi gibi çoklu döküman üzerinde atomik işlem (transaction) garantisi gerektiren sistemlerde ilişkisel veritabanları daha olgun bir çözüm sunar. MongoDB 4.0 ile multi-document transaction desteği gelmiş olsa da bu özellik performans maliyeti taşır.
  • Yüksek düzeyde veri tutarlılığı: Referans bütünlüğü (referential integrity) ve yabancı anahtar (foreign key) kısıtlamaları gibi veri tutarlılığı mekanizmalarına ihtiyacınız varsa, ilişkisel veritabanları bu garantileri veritabanı seviyesinde sağlar.
  • Raporlama ağırlıklı sistemler: Karmaşık gruplama, pivotlama ve çapraz tablo sorguları içeren iş zekası (BI) uygulamalarında SQL'in ifade gücü hâlâ rakipsizdir.

MongoDB ile Temel CRUD İşlemleri

MongoDB'yi pratikte nasıl kullanacağınızı görmek için temel CRUD işlemlerine bakalım:

// Veritabanı ve koleksiyon seçimi
use e_ticaret

// CREATE - Döküman ekleme
db.urunler.insertMany([
  {
    ad: "Kablosuz Kulaklık",
    marka: "SesPlus",
    fiyat: 899.90,
    stok: 150,
    etiketler: ["elektronik", "ses", "bluetooth"],
    olusturulma: new Date()
  },
  {
    ad: "Mekanik Klavye",
    marka: "KeyMaster",
    fiyat: 2199.00,
    stok: 45,
    switch_tipi: "Cherry MX Blue",
    etiketler: ["elektronik", "bilgisayar", "aksesuar"],
    olusturulma: new Date()
  }
])

// READ - Sorgulama
// Fiyatı 1000 TL'den düşük olan ürünleri getir
db.urunler.find({ fiyat: { $lt: 1000 } })

// Stokta olan elektronik ürünleri fiyata göre sırala
db.urunler.find({
  etiketler: "elektronik",
  stok: { $gt: 0 }
}).sort({ fiyat: 1 })

// UPDATE - Güncelleme
db.urunler.updateOne(
  { ad: "Kablosuz Kulaklık" },
  {
    $set: { fiyat: 749.90 },
    $inc: { stok: -1 }
  }
)

// DELETE - Silme
db.urunler.deleteMany({ stok: 0 })

Aggregation Pipeline ile Güçlü Sorgular

MongoDB'nin en güçlü özelliklerinden biri Aggregation Pipeline'dır. Karmaşık veri dönüşümleri ve analizleri için birden fazla aşamayı zincirlemenize olanak tanır:

// Kategoriye göre ortalama fiyat ve toplam stok analizi
db.urunler.aggregate([
  // Sadece stokta olan ürünler
  { $match: { stok: { $gt: 0 } } },

  // Etiketleri ayrıştır
  { $unwind: "$etiketler" },

  // Etikete göre grupla
  { $group: {
    _id: "$etiketler",
    ortalama_fiyat: { $avg: "$fiyat" },
    toplam_stok: { $sum: "$stok" },
    urun_sayisi: { $sum: 1 }
  }},

  // Ürün sayısına göre azalan sırala
  { $sort: { urun_sayisi: -1 } },

  // Çıktıyı biçimlendir
  { $project: {
    kategori: "$_id",
    ortalama_fiyat: { $round: ["$ortalama_fiyat", 2] },
    toplam_stok: 1,
    urun_sayisi: 1,
    _id: 0
  }}
])

Performans İpuçları

MongoDB ile çalışırken performansı artırmak için dikkat etmeniz gereken noktalar:

  1. İndeksleme: Sık sorgulanan alanlara mutlaka indeks ekleyin. İndeks olmadan MongoDB tüm koleksiyonu tarar (collection scan) ve bu büyük veri setlerinde ciddi yavaşlamaya neden olur.
    // Tekil alan indeksi
    db.urunler.createIndex({ fiyat: 1 })
    
    // Bileşik indeks
    db.urunler.createIndex({ kategori: 1, fiyat: -1 })
    
    // Metin arama indeksi
    db.urunler.createIndex({ ad: "text", aciklama: "text" })
    
  2. Projeksiyon kullanın: Sorgudan yalnızca ihtiyacınız olan alanları döndürün: db.urunler.find({}, { ad: 1, fiyat: 1 })
  3. Gömülü döküman vs referans: Birlikte okunan verileri gömülü (embedded) döküman olarak saklayın. Bağımsız erişilen veya çok büyüyen verileri ise referans ile ayrı koleksiyonlarda tutun.
  4. explain() ile sorgu analizi yapın: Sorgularınızın indeks kullanıp kullanmadığını db.urunler.find({...}).explain("executionStats") ile kontrol edin.

Mongoose ile Node.js Entegrasyonu

Node.js ekosisteminde MongoDB ile çalışmanın en yaygın yolu Mongoose ODM (Object Document Mapper) kütüphanesidir:

const mongoose = require('mongoose');

// Bağlantı
await mongoose.connect('mongodb://localhost:27017/e_ticaret');

// Şema tanımı (opsiyonel ama önerilen)
const urunSchema = new mongoose.Schema({
  ad:    { type: String, required: true, trim: true },
  fiyat: { type: Number, required: true, min: 0 },
  stok:  { type: Number, default: 0 },
  etiketler: [String],
  olusturulma: { type: Date, default: Date.now }
});

// Sanal alan
urunSchema.virtual('stokta_mi').get(function() {
  return this.stok > 0;
});

const Urun = mongoose.model('Urun', urunSchema);

// Kullanım
const yeniUrun = await Urun.create({
  ad: 'Bluetooth Hoparlör',
  fiyat: 1299.90,
  stok: 80,
  etiketler: ['elektronik', 'ses']
});

// Sorgulama
const uygunUrunler = await Urun
  .find({ fiyat: { $lte: 1500 } })
  .sort({ fiyat: 1 })
  .limit(10)
  .select('ad fiyat stok');

Sonuç: Doğru Aracı Doğru İş İçin Seçin

MongoDB, esnek şema yapısı, yatay ölçeklenebilirliği ve yüksek yazma performansı ile birçok modern uygulama senaryosunda mükemmel bir seçimdir. Ancak her veritabanı gibi MongoDB de her soruna çözüm değildir. Karar verirken şu soruları kendinize sorun:

  • Verim yapım sık değişiyor mu veya önceden tam olarak tanımlanamıyor mu? → MongoDB
  • Yüksek hacimde yazma işlemi ve yatay ölçekleme gerekiyor mu? → MongoDB
  • Verilerim arasında karmaşık ilişkiler ve JOIN operasyonları var mı? → İlişkisel DB
  • Katı veri tutarlılığı ve ACID garantileri şart mı? → İlişkisel DB

Unutmayın, modern mimarilerde polyglot persistence yaklaşımı giderek yaygınlaşmaktadır. Yani aynı projede farklı veri gereksinimleri için farklı veritabanlarını bir arada kullanmak tamamen geçerli ve hatta önerilen bir stratejidir. Kullanıcı profilleri MongoDB'de, finansal işlemler PostgreSQL'de, oturum bilgileri Redis'te tutulabilir. Önemli olan her bileşen için en uygun aracı seçmektir.

Yazar Hakkında
Fatih Algül
TechSoft Solutions
Proje mi var?

Yazılım, IoT veya otomasyon konularında destek almak ister misiniz?

İletişime Geç