MongoDB Nedir?
MongoDB, dünya genelinde en popüler NoSQL veritabanı sistemlerinden biridir. 2009 yılında MongoDB Inc. tarafından piyasaya sürülen bu açık kaynaklı veritabanı, belge odaklı (document-oriented) veri modeli kullanır. Geleneksel ilişkisel veritabanlarının (RDBMS) aksine, MongoDB verileri satır ve sütunlardan oluşan tablolarda değil, esnek JSON benzeri belgeler (BSON formatında) içinde saklar.
MongoDB'nin bu esnek yapısı, özellikle hızlı geliştirme döngüleri, değişken veri şemaları ve yüksek ölçeklenebilirlik gerektiren modern uygulamalar için ideal bir çözüm sunar. Sosyal medya platformları, e-ticaret siteleri, IoT uygulamaları ve içerik yönetim sistemleri MongoDB'yi yoğun olarak tercih etmektedir.
Belge (Document) Modeli
MongoDB'nin temel veri birimi belgedir (document). Her belge, anahtar-değer çiftlerinden oluşan BSON (Binary JSON) formatında saklanır. Bu yapı, iç içe nesneler ve diziler içerebilir, bu da karmaşık veri ilişkilerini tek bir belge içinde modelleyebilmenizi sağlar.
Koleksiyonlar ve Veritabanları
MongoDB'de belgeler koleksiyonlar (collections) içinde gruplandırılır. Koleksiyonlar, ilişkisel veritabanlarındaki tablolara benzer ancak sabit bir şemaya sahip değildir. Aynı koleksiyondaki belgeler farklı alanlara sahip olabilir, bu da şema evrimine olanak tanır.
Şemasız (Schema-less) Yapının Avantajları
- Esneklik: Farklı yapılardaki belgeler aynı koleksiyonda saklanabilir, veri modelinizi uygulamanız evrildikçe değiştirebilirsiniz.
- Hızlı geliştirme: Şema değişiklikleri için veritabanı migrasyonuna gerek yoktur, bu da geliştirme döngüsünü önemli ölçüde hızlandırır.
- Doğal veri temsili: Veriler uygulama kodundaki nesnelere doğal olarak eşlenebilir, ORM katmanına olan ihtiyacı azaltır.
CRUD İşlemleri
MongoDB'de temel veri işlemleri CRUD (Create, Read, Update, Delete) olarak bilinir. Her işlem için zengin bir sorgu dili ve çeşitli seçenekler sunar.
Belge Oluşturma (Create)
MongoDB'de belge oluşturmak için insertOne() ve insertMany() metotları kullanılır. insertOne() tek bir belge eklerken, insertMany() bir dizi belgeyi toplu olarak ekler. Her belgeye otomatik olarak benzersiz bir _id alanı atanır.
Belge Okuma (Read)
Verileri sorgulamak için find() ve findOne() metotları kullanılır. MongoDB'nin sorgu dili, karmaşık filtreleme, projeksiyon ve sıralama işlemlerini destekler. Karşılaştırma operatörleri ($eq, $gt, $lt, $in), mantıksal operatörler ($and, $or, $not) ve dizi operatörleri ($elemMatch, $size) gibi zengin bir operatör seti mevcuttur.
Belge Güncelleme (Update)
Güncelleme işlemleri updateOne(), updateMany() ve replaceOne() ile yapılır. Güncelleme operatörleri arasında $set (alan değeri ayarlama), $inc (sayısal değeri artırma), $push (diziye eleman ekleme), $pull (diziden eleman çıkarma) ve $unset (alan silme) bulunur.
Belge Silme (Delete)
Silme işlemleri deleteOne() ve deleteMany() ile gerçekleştirilir. Silme işlemi geri alınamaz olduğundan, üretim ortamlarında dikkatli kullanılmalı ve önemli veriler için yumuşak silme (soft delete) yaklaşımı düşünülmelidir.
Aggregation Pipeline
Aggregation Pipeline, MongoDB'nin en güçlü özelliklerinden biridir. Verileri bir dizi aşamadan (stage) geçirerek dönüştürmenize, gruplandırmanıza ve analiz etmenize olanak tanır.
Temel Pipeline Aşamaları
| Aşama | Açıklama | Kullanım Örneği |
|---|---|---|
| $match | Belgeleri filtreleme | Belirli koşullara uyan belgeleri seçme |
| $group | Belgeleri gruplama | Kategoriye göre satış toplamı |
| $project | Alan seçimi ve dönüşümü | Hesaplanmış alanlar oluşturma |
| $sort | Sonuçları sıralama | Fiyata göre azalan sıralama |
| $limit | Sonuç sayısını sınırlama | İlk 10 sonucu alma |
| $lookup | Koleksiyonlar arası birleştirme | SQL JOIN benzeri işlem |
| $unwind | Dizi alanlarını açma | Her dizi elemanı için ayrı belge |
Aggregation Pipeline Örnek Kullanımları
Aggregation Pipeline, iş zekası raporları, veri analizi ve karmaşık veri dönüşümleri için kullanılır. Örneğin, bir e-ticaret uygulamasında aylık satış raporları oluşturmak, müşteri segmentasyonu yapmak veya en çok satan ürünleri belirlemek için pipeline kullanabilirsiniz.
İndeksleme (Indexing)
İndeksler, MongoDB'de sorgu performansını dramatik şekilde artıran kritik bir bileşendir. İndeks olmadan MongoDB her sorgu için koleksiyondaki tüm belgeleri taramak (collection scan) zorunda kalır.
İndeks Türleri
- Tekli alan indeksi: Tek bir alan üzerinde oluşturulur. En temel indeks türüdür.
- Bileşik indeks (Compound Index): Birden fazla alan üzerinde oluşturulur. Alan sırası sorgu performansını etkiler.
- Metin indeksi (Text Index): Metin arama sorguları için kullanılır. Tam metin araması yapmanızı sağlar.
- Coğrafi indeks (Geospatial Index): Konum tabanlı sorgular için kullanılır (2dsphere, 2d).
- TTL indeksi: Belgelerin belirli bir süre sonra otomatik silinmesini sağlar. Oturum verileri ve önbellek için idealdir.
- Benzersiz indeks (Unique Index): Alanda tekrarlanan değerleri engeller.
İndeks Stratejileri
Doğru indeks stratejisi belirlemek, sorgu performansının anahtarıdır. explain() metodu ile sorgu planlarını analiz ederek hangi indekslerin kullanıldığını ve performans darboğazlarını tespit edebilirsiniz.
Replica Set: Yüksek Erişilebilirlik
Replica Set, MongoDB'nin yüksek erişilebilirlik (high availability) çözümüdür. Aynı veri kümesinin birden fazla sunucuda kopyasını tutarak, bir sunucu arızalandığında otomatik olarak başka bir sunucuya geçiş (failover) yapılmasını sağlar.
Replica Set Mimarisi
- Birincil (Primary): Tüm yazma işlemlerini kabul eden tek düğüm. İstemciler varsayılan olarak birincil düğümden okuma yapar.
- İkincil (Secondary): Birincil düğümün verilerini çoğaltan düğümler. Okuma trafiğini dağıtmak için kullanılabilir.
- Hakem (Arbiter): Veri tutmayan, yalnızca seçim oylamasına katılan düğüm. Çift sayıda düğüm olduğunda çoğunluğu sağlamak için kullanılır.
Otomatik Failover
Birincil düğüm arızalandığında, ikincil düğümler arasında otomatik seçim (election) yapılır ve yeni bir birincil düğüm belirlenir. Bu süreç genellikle 10-12 saniye içinde tamamlanır ve uygulama kesintisini minimize eder.
Sharding: Yatay Ölçeklendirme
Sharding, MongoDB'nin yatay ölçeklendirme stratejisidir. Veriyi birden fazla sunucuya (shard) dağıtarak, tek bir sunucunun kapasitesini aşan veri hacimlerini ve iş yüklerini desteklemeyi sağlar.
Shard Anahtarı Seçimi
Shard anahtarı, verinin parçalar arasında nasıl dağıtılacağını belirler. İyi bir shard anahtarı seçimi performans için kritik öneme sahiptir:
- Yüksek kardinalite: Çok sayıda farklı değere sahip alanlar tercih edilmelidir.
- Düşük frekans: Değerlerin eşit dağılımı, veri dengesizliğini önler.
- Monoton olmayan artış: Monoton artan değerler (timestamp gibi) tek bir shard'a yoğunlaşmaya neden olabilir.
MongoDB En İyi Uygulamalar
Veri modelleme, MongoDB'deki en kritik karardır. İlişkisel veritabanı düşüncesinden sıyrılarak, uygulamanızın erişim kalıplarına göre modelleme yapın.
Performans İpuçları
- Sorgu kalıplarınıza uygun indeksler oluşturun
- Gömülü belgeler (embedded documents) ile ilişkili verileri birlikte saklayın
- Büyük dizilerden kaçının; sınırsız büyüyen diziler belge boyutunu aşabilir
- Projeksiyon kullanarak yalnızca gerekli alanları getirin
- Write Concern ve Read Concern ayarlarını ihtiyacınıza göre yapılandırın
Sonuç
MongoDB, esnek belge modeli, güçlü aggregation pipeline'ı, kapsamlı indeksleme desteği ve yerleşik yüksek erişilebilirlik özellikleri ile modern uygulamalar için mükemmel bir veritabanı seçeneğidir. Replica set ve sharding ile hem güvenilirlik hem de ölçeklenebilirlik sağlayarak, startup'lardan büyük kurumsal projelere kadar her ölçekte başarıyla kullanılabilir.