MongoDB Tutorial: Kapsamlı Bir Rehber
MongoDB, modern uygulamaların hızla değişen veri ihtiyaçlarını karşılamak üzere tasarlanmış, açık kaynaklı, belge tabanlı bir NoSQL veri tabanıdır. Geleneksel ilişkisel veri tabanlarının katı şema yapısının aksine, MongoDB esnek bir şema sunar ve bu sayede geliştiricilere verilerini daha doğal ve sezgisel bir şekilde depolama imkanı tanır. Bu kapsamlı rehberde, MongoDB’nin temel kavramlarından başlayarak kurulumuna, temel CRUD (Create, Read, Update, Delete) işlemlerine, indekslemeye, agregasyona ve ileri seviye özelliklerine kadar birçok konuyu ele alacağız.
MongoDB Nedir ve Neden Kullanılır?
MongoDB, verileri JSON benzeri belge formatında depolayan bir NoSQL veri tabanıdır. “Belge tabanlı” olmak, verilerin anahtar-değer çiftleri, diziler ve iç içe geçmiş belgelerden oluşan esnek, kendi kendini açıklayan yapılar olarak saklandığı anlamına gelir. İlişkisel veri tabanlarındaki satır ve sütun yapısının aksine, MongoDB’de her belge farklı alanlara sahip olabilir.
Neden MongoDB Kullanılmalı?
1. Esneklik ve Şemasız Yapı: MongoDB, önceden tanımlanmış bir şemaya bağlı kalmadan veri depolamanıza olanak tanır. Bu, uygulama gereksinimleri değiştikçe veri yapısını kolayca adapte edebileceğiniz anlamına gelir. Hızlı prototipleme ve çevik geliştirme süreçleri için idealdir.
2. Yüksek Performans: Özellikle büyük veri setleri ve yüksek okuma/yazma yükleri altında performanslı çalışır. İndeksleme, sorgu optimizasyonu ve yatay ölçeklendirme yetenekleri sayesinde hızlı veri erişimi sağlar.
3. Ölçeklenebilirlik: MongoDB, yatay ölçeklendirme (sharding) yetenekleri sayesinde veri tabanınızı kolayca genişletebilir. Verilerinizi birden fazla sunucuya dağıtarak yüksek hacimli trafik ve büyük veri setlerini yönetebilir.
4. Yüksek Erişilebilirlik: Replikasyon setleri (replica sets) aracılığıyla veri tabanınızın her zaman erişilebilir olmasını sağlar. Bir sunucu arızalansa bile, diğer sunucular devreye girerek veri kaybını önler ve hizmet kesintisini minimize eder.
5. Zengin Sorgu Dili: SQL’e benzer güçlü ve esnek bir sorgu dili sunar. Karmaşık sorguları, filtrelemeyi, sıralamayı, projeksiyonu ve agregasyon işlemlerini kolayca yapmanızı sağlar.
6. Geliştirici Dostu: JSON benzeri BSON formatı sayesinde, JavaScript, Python, Java, C#, Node.js gibi popüler programlama dilleriyle kolayca entegre edilebilir. Geliştiricilerin veri tabanıyla etkileşim kurmasını basitleştirir.
Kullanım Alanları:
* Büyük Veri (Big Data): Petabaytlarca veriyi depolama ve işleme yeteneği sayesinde büyük veri uygulamaları için idealdir.
* Gerçek Zamanlı Analizler: Yüksek performanslı okuma/yazma işlemleri sayesinde gerçek zamanlı analiz ve raporlama sistemlerinde kullanılır.
* İçerik Yönetim Sistemleri (CMS): Esnek şeması, farklı içerik türlerini (makaleler, resimler, videolar) kolayca yönetmeye olanak tanır.
* Mobil Uygulamalar: Ölçeklenebilirlik ve performans gereksinimleri yüksek mobil backend’leri için tercih edilir.
* Nesnelerin İnterneti (IoT): Sensör verileri gibi yüksek hacimli ve yapılandırılmamış verilerin depolanmasında etkilidir.
MongoDB Kurulumu
MongoDB’yi kullanmaya başlamak için öncelikle sisteminize kurmanız gerekir. Kurulum adımları işletim sisteminize göre değişiklik gösterse de, genel mantık benzerdir.
1. MongoDB Topluluk Sunucusunu İndirme: MongoDB’nin resmi web sitesinden (mongodb.com/try/download/community) işletim sisteminize uygun (Windows, macOS, Linux) kurulum paketini indirin.
2. Kurulum Sihirbazını Takip Etme: İndirdiğiniz paketi çalıştırın ve kurulum sihirbazındaki adımları takip edin. Çoğu durumda “Complete” kurulum seçeneğini tercih edebilirsiniz.
3. Veri ve Log Dizinlerini Oluşturma: MongoDB, varsayılan olarak C:\data\db (Windows) veya /data/db (Linux/macOS) dizinine veri dosyalarını kaydeder. Bu dizinleri manuel olarak oluşturmanız gerekebilir.
* Windows: md C:\data\db
* Linux/macOS: sudo mkdir -p /data/db ve sudo chown -R $(whoami) /data/db
4. MongoDB Sunucusunu Başlatma: Komut istemcisi veya terminal üzerinden mongod komutunu çalıştırarak MongoDB sunucusunu başlatın.
* mongod
* Eğer mongod komutunu bulamazsa, MongoDB’nin kurulu olduğu dizindeki bin klasörünü sistem PATH’inize eklemeniz gerekebilir.
5. MongoDB Kabuğuna Bağlanma: Yeni bir komut istemcisi veya terminal açarak mongosh komutunu çalıştırın. Bu, MongoDB kabuğuna bağlanmanızı sağlar ve veri tabanıyla etkileşim kurmanızı sağlar.
* mongosh
Başarılı bir kurulum ve bağlantının ardından, mongosh ekranında test veri tabanına bağlı olduğunuzu göreceksiniz.
Temel MongoDB Kavramları
MongoDB’nin yapısını anlamak için bazı temel kavramları bilmek önemlidir:
* Veri Tabanı (Database): İlişkisel veri tabanlarındaki gibi, bir veri tabanı birbiriyle ilişkili koleksiyonların bir araya geldiği mantıksal bir kapsayıcıdır. Her uygulamanın genellikle kendi veri tabanı olur.
* use mydatabase komutu ile mydatabase adlı bir veri tabanına geçiş yapabilir veya yoksa oluşturabilirsiniz.
* Koleksiyon (Collection): İlişkisel veri tabanlarındaki tablolara benzer. Belgelerin bir araya geldiği gruplardır. Bir koleksiyon içindeki belgeler genellikle benzer bir yapıya sahiptir ancak kesinlikle aynı olmak zorunda değildir.
* Örnek: users koleksiyonu, products koleksiyonu.
* Belge (Document): MongoDB’deki temel veri birimidir. JSON (JavaScript Object Notation) formatına benzeyen BSON (Binary JSON) formatında depolanan anahtar-değer çiftlerinden oluşan yapılardır. İlişkisel veri tabanlarındaki satırlara benzerler ancak çok daha esnektirler.
* Her belge benzersiz bir _id alanına sahiptir. Bu alan, MongoDB tarafından otomatik olarak oluşturulur ve belgenin birincil anahtarı görevi görür.
* Örnek belge:
{
"_id": ObjectId("654a9d20c3a8e7b1d4f6a7b8"),
"name": "Ali Can",
"email": "ali.can@example.com",
"age": 30,
"address": {
"street": "Ana Cadde 123",
"city": "İstanbul",
"zipCode": "34000"
},
"hobbies": ["reading", "hiking", "coding"]
}
* BSON (Binary JSON): MongoDB, verileri JSON’ın ikili gösterimi olan BSON formatında saklar. BSON, JSON’a göre daha hızlı işlenebilir ve daha fazla veri türünü (örneğin, tarih, ikili veri) destekler.
CRUD İşlemleri (Create, Read, Update, Delete)
MongoDB’de veri yönetimi, temel CRUD işlemleri etrafında döner.
Veri Ekleme (Create)
Yeni belgeleri bir koleksiyona eklemek için insertOne() ve insertMany() metotları kullanılır.
* insertOne(): Tek bir belge ekler.
db.users.insertOne({
name: "Ayşe Yılmaz",
email: "ayse.yilmaz@example.com",
age: 28,
status: "active"
});
Bu komut, users koleksiyonuna yeni bir belge ekler ve otomatik olarak bir _id değeri oluşturur.
* insertMany(): Birden fazla belgeyi aynı anda ekler. Belgeler bir dizi içinde gönderilir.
db.products.insertMany([
{ name: "Laptop", brand: "Dell", price: 1200, stock: 50 },
{ name: "Mouse", brand: "Logitech", price: 25, stock: 200 },
{ name: "Keyboard", brand: "Razer", price: 75, stock: 100 }
]);
Veri Sorgulama (Read)
Mevcut belgeleri koleksiyonlardan okumak için find() ve findOne() metotları kullanılır.
* find(): Belirtilen kriterlere uyan tüm belgeleri döndürür. Kriter belirtilmezse, koleksiyondaki tüm belgeleri döndürür.
// Tüm kullanıcıları getir
db.users.find({});
// Yaşı 30'dan büyük kullanıcıları getir
db.users.find({ age: { $gt: 30 } });
// Markası "Dell" olan ürünleri getir
db.products.find({ brand: "Dell" });
* findOne(): Belirtilen kriterlere uyan ilk belgeyi döndürür.
// Adı "Ayşe Yılmaz" olan ilk kullanıcıyı getir
db.users.findOne({ name: "Ayşe Yılmaz" });
Sorgu Operatörleri: MongoDB, zengin sorgu operatörleri sunar:
* Karşılaştırma Operatörleri:
* $eq: Eşittir (varsayılan)
* $ne: Eşit değildir
* $gt: Büyüktür
* $gte: Büyük veya eşittir
* $lt: Küçüktür
* $lte: Küçük veya eşittir
* $in: Belirtilen değerlerden birine eşittir
* $nin: Belirtilen değerlerden hiçbirine eşit değildir
// Fiyatı 50 ile 100 arasında olan ürünler
db.products.find({ price: { $gte: 50, $lte: 100 } });
// Markası "Dell" veya "Logitech" olan ürünler
db.products.find({ brand: { $in: ["Dell", "Logitech"] } });
* Mantıksal Operatörler:
* $and: Tüm koşullar doğru olmalı
* $or: Koşullardan en az biri doğru olmalı
* $not: Koşulun tersi
* $nor: Tüm koşullar yanlış olmalı
// Yaşı 25'ten büyük VE durumu "active" olan kullanıcılar
db.users.find({ $and: [{ age: { $gt: 25 } }, { status: "active" }] });
// Yaşı 20'den küçük VEYA yaşı 40'tan büyük kullanıcılar
db.users.find({ $or: [{ age: { $lt: 20 } }, { age: { $gt: 40 } }] });
* Eleman Operatörleri:
* $exists: Belirtilen alanın var olup olmadığını kontrol eder
* $type: Belirtilen alanın veri tipini kontrol eder
// Email alanı olan belgeleri getir
db.users.find({ email: { $exists: true } });
* Dizi Operatörleri:
* $all: Dizideki tüm elemanları içerir
* $size: Dizinin belirli bir boyutta olmasını sağlar
* $elemMatch: Dizide belirli bir koşulu sağlayan en az bir eleman olmasını sağlar
// Hobileri arasında "coding" olan kullanıcılar
db.users.find({ hobbies: "coding" });
// Hobileri arasında "reading" VE "hiking" olan kullanıcılar
db.users.find({ hobbies: { $all: ["reading", "hiking"] } });
* Projeksiyon (Projection): Sorgu sonuçlarında hangi alanların gösterileceğini belirler.
// Sadece isim ve email alanlarını getir, _id'yi gizle
db.users.find({}, { name: 1, email: 1, _id: 0 });
1 alanı dahil etmek, 0 alanı hariç tutmak anlamına gelir. _id alanı varsayılan olarak gelir, onu gizlemek için açıkça 0 olarak belirtmek gerekir.
* Sıralama (Sort), Sınırlandırma (Limit), Atlatma (Skip):
// Yaşa göre artan sırada sırala ve ilk 5 belgeyi getir
db.users.find({}).sort({ age: 1 }).limit(5);
// Yaşa göre azalan sırada sırala, ilk 2 belgeyi atla ve sonraki 3 belgeyi getir
db.users.find({}).sort({ age: -1 }).skip(2).limit(3);
1 artan, -1 azalan sıra demektir.
Veri Güncelleme (Update)
Mevcut belgeleri değiştirmek için updateOne(), updateMany() ve replaceOne() metotları kullanılır.
* updateOne(): Belirtilen kriterlere uyan ilk belgeyi günceller.
* updateMany(): Belirtilen kriterlere uyan tüm belgeleri günceller.
* replaceOne(): Belirtilen kriterlere uyan ilk belgeyi tamamen yeni bir belgeyle değiştirir. _id alanı aynı kalır.
Güncelleme Operatörleri:
* $set: Bir alanın değerini ayarlar veya yeni bir alan ekler.
// Adı "Ayşe Yılmaz" olan kullanıcının yaşını 29 yap ve status alanını "inactive" olarak ayarla
db.users.updateOne(
{ name: "Ayşe Yılmaz" },
{ $set: { age: 29, status: "inactive" } }
);
* $inc: Bir alanın değerini belirtilen miktarda artırır veya azaltır.
// Fiyatı 1200 olan ürünün stok miktarını 10 artır
db.products.updateOne(
{ price: 1200 },
{ $inc: { stock: 10 } }
);
* $unset: Bir alanı belgeden kaldırır.
// Adı "Ali Can" olan kullanıcının email alanını kaldır
db.users.updateOne(
{ name: "Ali Can" },
{ $unset: { email: "" } }
);
* $push: Bir diziye yeni bir eleman ekler.
// Adı "Ayşe Yılmaz" olan kullanıcının hobilerine "yoga" ekle
db.users.updateOne(
{ name: "Ayşe Yılmaz" },
{ $push: { hobbies: "yoga" } }
);
* $pull: Bir diziden belirtilen değere sahip elemanları kaldırır.
// Adı "Ayşe Yılmaz" olan kullanıcının hobilerinden "reading"i kaldır
db.users.updateOne(
{ name: "Ayşe Yılmaz" },
{ $pull: { hobbies: "reading" } }
);
* $addToSet: Bir diziye yalnızca belirtilen eleman dizide yoksa ekler (benzersiz elemanlar için).
// Adı "Ali Can" olan kullanıcının hobilerine "swimming"i ekle, eğer yoksa
db.users.updateOne(
{ name: "Ali Can" },
{ $addToSet: { hobbies: "swimming" } }
);
Upsert Seçeneği: upsert: true seçeneği, eğer güncelleme kriterlerine uyan bir belge bulunamazsa, yeni bir belge oluşturulmasını sağlar.
// Adı "Mehmet Demir" olan kullanıcıyı güncelle. Yoksa yeni bir belge oluştur.
db.users.updateOne(
{ name: "Mehmet Demir" },
{ $set: { age: 35, status: "active" } },
{ upsert: true }
);
Veri Silme (Delete)
Belgeleri veya koleksiyonları veri tabanından kaldırmak için deleteOne(), deleteMany() ve drop() metotları kullanılır.
* deleteOne(): Belirtilen kriterlere uyan ilk belgeyi siler.
// Adı "Ayşe Yılmaz" olan ilk kullanıcıyı sil
db.users.deleteOne({ name: "Ayşe Yılmaz" });
* deleteMany(): Belirtilen kriterlere uyan tüm belgeleri siler. Kriter boş ({}) verilirse, koleksiyondaki tüm belgeleri siler.
// Yaşı 20'den küçük tüm kullanıcıları sil
db.users.deleteMany({ age: { $lt: 20 } });
// Tüm ürünleri sil
db.products.deleteMany({});
* drop(): Bir koleksiyonu tamamen siler.
// "products" koleksiyonunu sil
db.products.drop();
* Veri Tabanını Silme:
// Aktif veri tabanını sil
db.dropDatabase();
Bu komutu dikkatli kullanın, geri dönüşü yoktur.
İndeksleme
İndeksler, MongoDB’nin sorgu performansını artırmak için kullandığı özel veri yapılarıdır. Belirli alanlardaki verilere hızlı erişim sağlayarak sorguların daha verimli çalışmasına olanak tanır. İlişkisel veri tabanlarındaki indekslere benzer şekilde çalışır.
* Neden İndeks Kullanılır?
* Sorgu hızını artırır.
* Sıralama işlemlerini hızlandırır.
* Veri tabanının genel performansını iyileştirir.
* İndeks Oluşturma: createIndex() metodu ile indeks oluşturulur.
// "name" alanı üzerinde artan sırada tek alan indeksi oluştur
db.users.createIndex({ name: 1 });
// "brand" ve "price" alanları üzerinde bileşik indeks oluştur
db.products.createIndex({ brand: 1, price: -1 });
1 artan, -1 azalan sıra demektir.
* İndeks Türleri:
* Tek Alan İndeksi: En basit indeks türüdür. Tek bir alan üzerinde oluşturulur.
* Bileşik İndeks: Birden fazla alan üzerinde oluşturulur. Sorgular bu alanların kombinasyonlarını içerdiğinde faydalıdır.
* Multikey İndeks: Dizi içeren alanlar üzerinde oluşturulur. Dizideki her eleman için ayrı bir indeks girişi oluşturulur.
* Text İndeks: Metin tabanlı arama yapmak için kullanılır.
* Geospatial İndeks: Coğrafi konum tabanlı sorgular için kullanılır.
* İndeksleri Listeleme:
db.users.getIndexes();
* İndeksi Silme:
// "name_1" adlı indeksi sil
db.users.dropIndex("name_1");
// Tüm indeksleri sil (varsayılan _id indeksi hariç)
db.users.dropIndexes();
* Sorgu Planını Anlama (explain()): Bir sorgunun nasıl çalıştığını ve indeksleri kullanıp kullanmadığını görmek için explain() metodunu kullanabilirsiniz.
db.users.find({ age: { $gt: 30 } }).explain("executionStats");
Bu, sorgunun performansını analiz etmenize yardımcı olur.
Agregasyon Çerçevesi (Aggregation Framework)
Agregasyon çerçevesi, MongoDB’de karmaşık veri işleme ve analiz görevlerini gerçekleştirmek için güçlü bir araçtır. Bir dizi “aşama” (pipeline stages) kullanarak belgeleri dönüştürmenize, filtrelemenize, gruplandırmanıza ve özetlemenize olanak tanır.
* Nasıl Çalışır? Agregasyon, bir dizi ardışık aşamadan oluşan bir boru hattı (pipeline) şeklinde çalışır. Her aşama, önceki aşamanın çıktısını alır, üzerinde bir işlem yapar ve bir sonraki aşamaya iletir.
* Yaygın Agregasyon Aşamaları:
* $match: Belgeleri filtreler (sorguya benzer).
* $project: Belge yapısını yeniden şekillendirir, alanları dahil eder/hariç tutar, yeni alanlar oluşturur.
* $group: Belgeleri belirli bir anahtara göre gruplandırır ve gruplandırılmış veriler üzerinde agregasyon işlemleri (sayı, toplam, ortalama vb.) yapar.
* $sort: Belgeleri sıralar.
* $limit: Belge sayısını sınırlar.
* $skip: Belirli sayıda belgeyi atlar.
* $unwind: Dizi alanlarını tek tek belgelere ayırır.
* $lookup: Başka bir koleksiyondan belge birleştirmek için (sol dış birleşime benzer).
Örnek Agregasyon Sorgusu:
Kullanıcıların yaş ortalamasını ve her yaş grubundaki kullanıcı sayısını bulalım:
db.users.aggregate([
{
$match: { status: "active" } // Sadece aktif kullanıcıları filtrele
},
{
$group: { // Yaşa göre gruplandır
_id: "$age", // Gruplama anahtarı "age" alanı
count: { $sum: 1 }, // Her gruptaki belge sayısını say
averageAge: { $avg: "$age" } // Her gruptaki yaş ortalamasını hesapla (bu örnekte _id ile aynı olacaktır)
}
},
{
$sort: { _id: 1 } // Yaş grubuna göre sırala
},
{
$project: { // Sadece belirli alanları göster
_id: 0, // _id alanını gizle
ageGroup: "$_id", // _id alanını "ageGroup" olarak yeniden adlandır
userCount: "$count",
avgAge: "$averageAge"
}
}
]);
Bu örnek, aktif kullanıcıları filtreler, yaşlarına göre gruplandırır, her yaş grubundaki kullanıcı sayısını ve ortalama yaşını hesaplar, sonuçları yaş grubuna göre sıralar ve son olarak çıktı formatını düzenler.
Replikasyon (Replication)
Replikasyon, verilerinizi birden fazla sunucuya (replika seti) kopyalayarak veri tabanınızın yüksek erişilebilirliğini ve veri yedekliliğini sağlayan bir özelliktir. Bir replika seti, birincil (primary) bir düğümden ve bir veya daha fazla ikincil (secondary) düğümden oluşur.
* Amacı:
* Yüksek Erişilebilirlik: Birincil düğüm arızalandığında, ikincil düğümlerden biri otomatik olarak yeni bir birincil düğüm olur, böylece kesintisiz hizmet sağlanır.
* Veri Yedekliliği: Verilerinizin birden fazla kopyası olduğu için donanım arızaları veya felaket durumlarında veri kaybı riski azalır.
* Okuma Ölçeklendirmesi: Okuma işlemleri ikincil düğümlere yönlendirilerek birincil düğümün üzerindeki yük azaltılabilir.
* Replica Set Yapısı:
* Primary: Tüm yazma işlemlerini kabul eden düğümdür. Okuma işlemleri de yapabilir.
* Secondary: Birincil düğümdeki verilerin kopyalarını tutar ve yazma işlemlerini birincil düğümden çoğaltır. Okuma işlemleri için kullanılabilir.
* Kurulum Adımları (Basitçe):
1. Her bir sunucuda mongod‘u replica set adıyla başlatın (örneğin, mongod --replSet rs0 --port 27017 --dbpath /data/db).
2. mongosh ile birincil düğüme bağlanın.
3. Replica setini başlatın: rs.initiate({ _id: "rs0", members: [{ _id: 0, host: "server1:27017" }] }).
4. Diğer ikincil düğümleri ekleyin: rs.add("server2:27017").
Sharding (Parçalama)
Sharding, büyük veri setlerini ve yüksek yazma/okuma yüklerini yönetmek için MongoDB’nin yatay ölçeklendirme çözümüdür. Verileri birden fazla sunucuya (shard) dağıtarak tek bir sunucunun kapasite sınırlamalarını aşmanızı sağlar.
* Amacı:
* Yatay Ölçeklendirme: Veri tabanının kapasitesini artırmak için yeni sunucular eklemeyi sağlar.
* Yüksek Performans: Sorgu yükünü birden fazla sunucuya dağıtarak daha hızlı yanıt süreleri elde edilir.
* Büyük Veri Setleri: Petabaytlarca veriyi depolama ve işleme yeteneği sunar.
* Sharding Bileşenleri:
* Shards (Parçalar): Verilerin bir kısmını depolayan ve işleyen bağımsız mongod örnekleri veya replica setleridir.
* Config Servers (Yapılandırma Sunucuları): Cluster’ın meta verilerini (hangi verinin hangi shard’da olduğu gibi) depolar.
* mongos (Router): Uygulama ile shard’lar arasında bir arayüz görevi görür. Sorguları doğru shard’lara yönlendirir ve sonuçları birleştirir.
* Shard Key: Verilerin hangi shard’a dağıtılacağını belirleyen bir veya daha fazla alandan oluşan bir anahtardır. Doğru shard key seçimi, sharding performansının anahtarıdır.
Güvenlik Temelleri
Veri tabanı güvenliği kritik öneme sahiptir. MongoDB, verilerinizi korumak için çeşitli güvenlik özellikleri sunar.
* Kimlik Doğrulama (Authentication): Kullanıcıların veri tabanına erişimini doğrular. SCRAM (Salted Challenge Response Authentication Mechanism) ve x.509 sertifikaları gibi yöntemler kullanılır.
* MongoDB’yi yetkilendirme ile başlatmak için mongod --auth komutunu kullanın.
* Kullanıcı oluşturma: db.createUser({ user: "admin", pwd: "password", roles: [{ role: "root", db: "admin" }] }).
* Yetkilendirme (Authorization – RBAC): Kullanıcılara belirli roller atayarak hangi işlemleri hangi veri tabanları ve koleksiyonlar üzerinde yapabileceklerini kontrol eder.
* Önceden tanımlanmış roller (read, readWrite, dbAdmin, clusterAdmin vb.) veya özel roller oluşturulabilir.
* Ağ Şifreleme (TLS/SSL): İstemci ile sunucu arasındaki iletişimin şifrelenmesini sağlar, böylece veriler ağ üzerinden güvenli bir şekilde aktarılır.
* Ağ Erişimi Kısıtlamaları: Güvenlik duvarları (firewall) kullanarak sadece belirli IP adreslerinden veya ağlardan erişime izin verilmelidir. MongoDB’nin varsayılan portu 27017’dir.
* Günlük Kayıtları (Auditing): Veri tabanı üzerindeki önemli olayları (giriş denemeleri, sorgular, güncellemeler) kaydetmek, güvenlik ihlallerini tespit etmek için önemlidir.
Yedekleme ve Geri Yükleme
Veri kaybını önlemek ve felaket kurtarma senaryolarına hazırlanmak için düzenli yedeklemeler yapmak çok önemlidir.
* mongodump: MongoDB veri tabanının veya belirli koleksiyonların ikili (binary) yedeğini alır.
mongodump --db mydatabase --out /path/to/backup/directory
* mongorestore: mongodump ile alınan yedekleri geri yükler.
mongorestore --db mydatabase --drop /path/to/backup/directory/mydatabase
--drop seçeneği, geri yüklemeden önce mevcut koleksiyonları siler.
* Dosya Sistemi Anlık Görüntüleri (Filesystem Snapshots): Veri tabanının çalıştığı sunucunun dosya sistemi anlık görüntülerini almak da bir yedekleme stratejisi olabilir. Bu yöntem, özellikle büyük veri tabanları için hızlı ve verimli olabilir.
MongoDB Atlas
MongoDB Atlas, MongoDB’nin bulut tabanlı, tam olarak yönetilen bir hizmetidir. AWS, Google Cloud ve Azure gibi büyük bulut sağlayıcılarında çalışır.
* Avantajları:
* Kolay Kurulum ve Yönetim: Altyapı yönetimiyle uğraşmadan birkaç tıklamayla bir MongoDB kümesi oluşturulabilir ve yönetilebilir.
* Otomatik Ölçeklendirme: İhtiyaçlara göre otomatik olarak ölçeklenebilir, böylece performans sorunları yaşanmaz.
* Yüksek Erişilebilirlik ve Yedekleme: Yerleşik replikasyon ve otomatik yedekleme özellikleriyle veri güvenliği ve erişilebilirliği sağlanır.
* Gelişmiş İzleme ve Analiz: Performans metrikleri, sorgu analizleri ve uyarılar sunar.
* Güvenlik: Kapsamlı güvenlik özellikleri (ağ izolasyonu, şifreleme, RBAC) ile veriler korunur.
* Sunucusuz (Serverless) Seçenekler: Daha küçük ve dinamik iş yükleri için sunucusuz veri tabanı seçenekleri sunar.
MongoDB Atlas, özellikle geliştiricilerin altyapı yerine uygulama geliştirmeye odaklanmasını sağlayan modern bir çözümdür.
En İyi Uygulamalar
MongoDB’den en iyi şekilde yararlanmak için bazı en iyi uygulamaları göz önünde bulundurmak önemlidir:
* Şema Tasarımı:
* Gömme (Embedding) vs. Referanslama (Referencing): Verileri tek bir belgede gömmek mi yoksa ayrı belgelerde saklayıp referanslarla bağlamak mı gerektiğine karar verin.
* Gömme: Veriler birlikte erişildiğinde ve boyutu sınırlı olduğunda daha iyi performans sağlar. Tek bir sorgu ile tüm ilgili verilere ulaşılır.
* Referanslama: Veriler ayrı ayrı değiştiğinde, ilişkiler çok-çok olduğunda veya gömülü veri çok büyüdüğünde tercih edilir. Daha fazla sorgu gerektirebilir.
* Veri Büyüklüğü: Belgelerinizi çok büyük yapmaktan kaçının (16MB belge boyutu sınırı).
* İndeksleme Stratejisi:
* Sıkça sorgulanan alanlara, sıralama ve gruplandırma yapılan alanlara indeks ekleyin.
* explain() kullanarak sorgularınızın indeksleri doğru kullanıp kullanmadığını kontrol edin.
* Çok fazla indeks oluşturmaktan kaçının, çünkü indeksler yazma işlemlerini yavaşlatır ve disk alanı kaplar.
* Sorgu Optimizasyonu:
* Yalnızca ihtiyacınız olan alanları getirmek için projeksiyon kullanın.
* limit() ve skip() kullanırken dikkatli olun, özellikle büyük skip değerleri performans sorunlarına yol açabilir.
* $or sorgularını optimize etmek için uygun indeksler kullanın.
* Bağlantı Havuzu (Connection Pooling): Uygulamalarınızda veri tabanı bağlantı havuzu kullanarak bağlantı açma/kapama maliyetini azaltın ve performansı artırın.
* Hata Yönetimi ve Loglama: Uygulamalarınızda ve MongoDB sunucusunda hata yönetimi ve kapsamlı günlük kaydı uygulayın.
* Sürüm Güncellemeleri: MongoDB’nin yeni sürümlerini takip edin ve güncel kalın. Yeni sürümler genellikle performans iyileştirmeleri ve yeni özellikler sunar.
Sonuç
MongoDB, esnek şeması, yüksek performansı ve yatay ölçeklenebilirlik yetenekleri ile modern uygulama geliştirmenin vazgeçilmez araçlarından biridir. Bu rehberde, MongoDB’nin temel kavramlarından başlayarak kurulumuna, CRUD işlemlerine, indekslemeye, agregasyona, replikasyon ve sharding gibi ileri seviye özelliklerine ve güvenlik konularına değindik.
MongoDB’nin sunduğu bu güçlü özellikler, geliştiricilere büyük veri setlerini yönetme, yüksek trafikli uygulamalar oluşturma ve hızla değişen iş gereksinimlerine adapte olma esnekliği sağlar. Uygulamanızın ihtiyaçlarına uygun bir şekilde MongoDB’yi kullanarak, veri tabanı yönetimini daha verimli ve etkili hale getirebilirsiniz. Unutmayın, en iyi öğrenme yolu pratik yapmaktır. MongoDB kabuğunda komutları denemekten ve kendi projelerinizde kullanmaktan çekinmeyin.