Kurs
MongoDB, verileri koleksiyonlar hâlinde düzenlenmiş, JSON benzeri dokümanlarda saklayan esnek, doküman tabanlı bir yaklaşım kullanan bir NoSQL veritabanıdır. Kısacası, MongoDB ile çalışırken verileriniz JSON'a çok benzeyen bir biçimde tutulur. Bu da verileri okumayı, koda eşlemeyi ve ölçeklendirmeyi kolaylaştırır. MongoDB moderndir ve ilişkisel veritabanlarından farklı bir yaklaşım izler. İlişkisel veritabanları verileri tablolardaki satırlar aracılığıyla saklar. Bu yaklaşımın avantajları vardır, ancak en büyük zorluklarından biri, ek tablolar kullanarak ilişkiler kurmaktır. MongoDB bu sorunu, verilerin tablolarda değil koleksiyonlarda saklandığı esnek şema yaklaşımıyla çözer. Bu, bir nesneyle ilgili verilerin o nesneyle birlikte tutulabileceği anlamına gelir. Bu eğitimde, MongoDB kullanırken bir başlangıç düzeyindeki kullanıcının bilmesi gereken yedi kavramı inceleyeceğiz. Hazırsanız başlayalım.
NoSQL ve Doküman Veritabanlarını Anlamak
Çoğu kişi veritabanı deyince, verileri satırlar, tablolar ve ilişkilerle saklayan SQL'i düşünür. Bu, özellikle uygulama verileri yapılandırılmış olduğunda birçok uygulama için harikadır. Ancak veriler düzgünce bir tablo yapısına oturmadığında kısıtlayıcı gelebilir.
İşte burada NoSQL devreye girer. NoSQL basitçe “yalnızca SQL değil” anlamına gelir. Katı tablo modelinden uzaklaşarak daha fazla esneklik sunan bir veritabanı ailesini kapsar. Tüm verilerinizi önceden tanımlanmış sütunlara zorlamak yerine, verilerinizi uygulamanızın gerçekten nasıl çalıştığına uygun şekilde yapılandırabilirsiniz.
MongoDB bir doküman veritabanıdır ve en popüler NoSQL türlerinden biridir. Satırlar ve tablolar yerine veriler koleksiyonlarda dokümanlar olarak saklanır. Her doküman, anahtar-değer çiftleri, diziler ve hatta iç içe nesnelerle JSON'a oldukça benzer. Bu, gerçek dünya verilerini temsil etmeyi çok kolaylaştırır. İyi bir örnek, adresler ve tercihlerin tek bir kayıtta yer aldığı bir kullanıcı profili olabilir; bunu birden fazla tabloya dağıtmaya gerek kalmaz. Adresler ve tercihlerin tek bir kayıtta nasıl görüneceğine MongoDB üzerinde bakalım.
{
"_id": "u123",
"name": "Moses Anu",
"email": "moses@example.com",
"addresses": [
{ "type": "home", "city": "Abuja" },
{ "type": "work", "city": "Lagos" }
],
"preferences": {
"language": "English",
"theme": "dark"
}
}
MongoDB Mimarisi Temelleri
MongoDB ile etkili çalışmak için, bir MongoDB veritabanında verilerin nasıl organize edildiğini anlamak gerekir. Verilerin tablolar ve satırlar hâlinde yapılandırıldığı SQL veritabanlarının aksine, MongoDB koleksiyonlar ve dokümanlar kullanır.
- Veritabanı: Her şey için bir kap gibi düşünebilirsiniz. MySQL'de birden fazla veritabanına sahip olabileceğiniz gibi, MongoDB de farklı proje veya uygulamalar için birden fazla veritabanı esnekliği sunar.
- Koleksiyon: Her veritabanının içinde koleksiyonlar bulunur. Bir koleksiyonu, çok esnek bir şemaya sahip tablo gibi düşünebilirsiniz. Çünkü MongoDB tabloları katı bir şema dayatmaz. Farklı alanlara sahip dokümanları aynı koleksiyona koyabilirsiniz.
- Doküman: Asıl sihir burada gerçekleşir. Doküman, verilerinizi tutan JSON benzeri bir nesnedir (aslında altyapıda BSON). Dokümanlar iç içe nesneler ve diziler barındırabilir; bu da modern uygulamalarda çalışmayı çok daha doğal kılar. BSON'dan bir sonraki paragrafta daha fazla bahsedeceğiz.
MongoDB mimarisini daha iyi anlamak için bir örnek verelim. Diyelim ki MongoDB kullanarak basit bir e-ticaret uygulaması geliştiriyoruz. Verilerimiz aşağıdaki yapıyı izlerdi.
- shopDB adında bir veritabanı olurdu.
- Bunun içinde products adında bir koleksiyon bulunurdu.
- Ve bu koleksiyonun içinde, her ürünün ad, fiyat ve kategori gibi ayrıntılarını temsil eden dokümanlar olurdu.
Esnek şema
Esnek şema kavramını daha iyi anlamak için yukarıdaki örneğimizden yola çıkalım: Bir ürünün indirim alanı olabilirken, bir diğerinde olmayabilir. MongoDB, her ürünün tam olarak aynı alanlara sahip olmasını zorunlu kılmaz. Bu esneklik, özellikle hızla evrilen uygulamalar geliştirirken, geliştiricilerin MongoDB'yi sevmesinin başlıca nedenlerinden biridir.
BSON ve Veri Türleri
Daha önce JSON ile çalıştıysanız, MongoDB size çok daha doğal gelecektir. Aslında MongoDB verilerinizi düz JSON olarak saklamaz. MongoDB, BSON adı verilen bir format kullanır. BSON, İkili JSON anlamına gelir.
BSON nedir ve MongoDB neden kullanır?
BSON, JSON'un daha akıllı ve verimli kuzeni gibidir. Geliştiricilerin sevdiği okunabilir anahtar-değer yapısını korur, ancak birkaç süper güç ekler:
- JSON'dan daha fazla veri türünü destekler (tarih, ondalık ve ham ikili gibi).
- hızlı kodlama/çözme için optimize edilmiştir; bu, MongoDB sorgularının daha hızlı çalışmasını sağlar.
- Her şeyi kompakt bir ikili formatta saklar; bu da büyük veri hacimleri için daha verimlidir.
Özetle, BSON MongoDB'ye JSON'un esnekliğini artı veritabanlarının ihtiyaç duyduğu performans ve hassasiyeti sağlar.
Yaygın BSON veri türleri
MongoDB geniş bir veri türü yelpazesini destekler, ancak en yaygın olanlar ve örnekleri şunlardır:
- String :
"name": "Alice" - Number :
"age": 28 - Boolean :
"isActive": true - Date :
"createdAt": ISODate("2025-08-18T10:00:00Z") - Array :
"skills": ["MongoDB", "Node.js", "React"] - Gömülü doküman. Dokümanlar içinde iç içe nesneler:
"address": {
"city": "Lagos",
"country": "Nigeria"
}
- ObjectId: MongoDB'nin benzersiz doküman kimlikleri için kullandığı özel kimlik türü.
ObjectId("64f5c9e8a5f76b1d2c3a4567")
MongoDB'de saklanan BSON formatında örnek bir kullanıcı profili dokümanına bakalım:
{
"_id": ObjectId("64f5c9e8a5f76b1d2c3a4567"),
"name": "Moses",
"age": 30,
"isActive": true,
"skills": ["Laravel", "MongoDB", "Vue"],
"address": {
"city": "Abuja",
"country": "Nigeria"
},
"createdAt": ISODate("2025-08-18T10:00:00Z")
}
Dikkat etmemiz gereken birkaç nokta:
_idalanı, siz kendiniz belirlemezseniz otomatik olarak birObjectIdolarak üretilir.- Tarihler düz string olarak değil,
ISODateolarak saklanır. - İç içe
addressdokümanı veskillsdizisi, düz SQL satırlarına göre MongoDB'nin esnekliğini gösterir.
Şema Tasarım İlkeleri
MongoDB, esnek bir şemaya sahip olduğu için uygulamanız büyüdükçe veri modelinizi geliştirmenize olanak tanır. Ancak doğru şema tasarımı olmadan, MongoDB'nin esnek şeması hızla karmakarışık bir hâle gelebilir. Esnek şema sunuyor diye yapıyı tamamen bir kenara atmamalısınız. MongoDB ile çalışırken kullanabileceğiniz bazı şema tasarım ilkelerini gözden geçirelim.
Esnek şema ve şemasız arasındaki fark
MongoDB sıklıkla şemasız olarak tanımlanır; ancak bu biraz yanıltıcıdır. Her dokümanın aslında bir şeması vardır—yalnızca siz doğrulama kuralları eklemeyi seçmedikçe veritabanı seviyesinde zorunlu kılınmaz.
Örneğin, aynı users koleksiyonundaki iki doküman teknik olarak çok farklı görünebilir:
// Document 1
{ "name": "Alice", "email": "alice@example.com" }
// Document 2
{ "username": "Bob123", "age": 29 }
Bu esneklik hızlı prototipleme sırasında harika olabilir, ancak üretimde genellikle bir miktar tutarlılık istersiniz. İşte burada JSON Schema doğrulaması devreye girer. Dağınık ve güvenilmez verilerle karşılaşmamak için belirli kuralları zorunlu kılabilirsiniz.
Dokümanları gömmek (embedding) ve başvuru vermek (referencing)
MongoDB şema tasarımında bir diğer önemli karar, ilişkileri nasıl modelleyeceğinizdir. İlişkilerin bir MongoDB dokümanında nasıl modellenebileceğine bakalım.
Gömme (verileri bir dokümanın içine yerleştirme)
MongoDB, koleksiyon içinde doküman gömmeyi destekler. Bu yaklaşım, birlikte erişilen veriler için en uygunudur. Örneğin bir blog gönderisinin yorumlarının doğrudan içinde tutulması gibi. Aşağıda gömme yöntemine bir örnek bulunmaktadır.
{
"title": "Intro to MongoDB",
"comments": [
{ "user": "Alice", "text": "Great post!" },
{ "user": "Bob", "text": "Very helpful." }
]
}
Bu şekilde saklanan veriler daha iyi performans sağlar ve verileri almak ya da üzerinde çalışmak için daha az sorgu gerektirir. Ancak doğru yapılandırılmazsa şişkin dokümanlara yol açabilir.
Referans verme (dokümanlar arasında bağlantı kurma)
İlişkili verilerin boyutunun büyüdüğü veya sıkça yeniden kullanıldığı durumlarda, veriler arasında bağlantı kurmak (referans vermek) tavsiye edilir. Buna referanslama denir.
Örneğin çok sayıda yorumu olan bir blog gönderisi. Bu durumda yalnızca yorumların kimliklerini saklayabilir; yorumların kendisini ayrı bir koleksiyonda tutabiliriz. Aşağıdaki kod bu yaklaşıma bir örnektir.
// Blog post
{ "title": "Intro to MongoDB", "commentIds": [ObjectId("..."), ObjectId("...")] }
// Separate comment document
{ "_id": ObjectId("..."), "user": "Alice", "text": "Great post!" }
Verilerimizi bu şekilde yapılandırmak dokümanları küçük tutar, tekrarları önler ve kodun bakımı kolaylaşır. Ancak birden fazla sorgu gerektirir (yine de toplu işlemde $lookup join'ları kullanılabilir).
Yaygın şema tasarım hatalarından kaçınma
Aşırı gömme: MongoDB esnek bir şemaya sahip olduğu için, her şeyi tek bir devasa dokümana doldurmak kolaydır. Bu tavsiye edilmez ve kötü performansa yol açabilir. MongoDB, doküman başına 16 MB maksimum boyut uygular. Bu, geliştiricilerin verileri doğru şekilde dokümanlara bölmesini sağlamak içindir.
İndeksleri yok sayma: MongoDB ile çalışırken indeksleri göz ardı etmeyin. Sorgularınız şema tasarımınızla uyumlu değilse, yavaş aramalarla karşılaşabilirsiniz. Daima erişim kalıplarını göz önünde bulundurarak tasarlayın.
MongoDB'yi SQL gibi ele almak: Verileri küçük dokümanlara bölmek sorun değildir. Ancak MongoDB'nin esnek bir şemaya sahip olduğunu anlayın ve onu ilişkisel bir veritabanı gibi ele almayın. İlişkisel şemanızı 1:1 olarak MongoDB'ye kopyalarsanız (çok sayıda küçük, normalize tablo/koleksiyon), doküman modellemenin avantajlarını kaybedersiniz.
Şemalarınızı planlamak için zaman ayırın. Düşünülmüş bir şema, uygulamanızın performansını büyük ölçüde etkileyebilir.
Veri Doğrulama
MongoDB esnektir. Dikkat edilmediğinde bu, kolayca yapılandırılmamış ve dağınık verilere yol açabilir. İşte burada veri doğrulama devreye girer.
Doğrulamayı, koleksiyonlarınız için temel kurallar koymak olarak düşünün. Eklenen veya güncellenen her dokümanın belirli kurallara uymasını sağlar; örneğin bir e-posta alanının zorunlu olması ya da “age” değerinin her zaman bir sayı olması gibi.
MongoDB'de JSON Schema doğrulaması kullanma
MongoDB doğrulama için JSON Schema destekler. JSON Schema, dokümanlarınızın biçimini tanımlamanın standart bir yoludur. Zorunlu kılınabilecek bazı kurallar şunlardır:
- Zorunlu alanlar.
- Veri türleri (string, number, date vb.).
- Değer aralıkları veya string desenleri.
Veri doğrulama, MongoDB ile çalışırken iki dünyanın en iyisini sunabilir. MongoDB'nin esnek şeması artı koruyucu bariyerler, verilerimizin temiz kalmasına yardımcı olur.
Veriyi temiz tutmak için kuralları zorunlu kılma
Diyelim ki bir users koleksiyonumuz var. Şunları sağlamak istiyoruz:
- Her kullanıcının bir adı olsun (string).
- Her kullanıcının bir e-postası olsun (string, e-posta biçiminde).
- Yaş alanı varsa, 18 veya daha büyük bir sayı olsun.
Bunu bir JSON Schema doğrulayıcı ile şöyle zorunlu kılabiliriz:
db.createCollection("users", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["name", "email"],
properties: {
name: {
bsonType: "string",
description: "must be a string and is required"
},
email: {
bsonType: "string",
pattern: "^.+@.+\\..+$",
description: "must be a valid email address"
},
age: {
bsonType: "int",
minimum: 18,
description: "must be an integer greater than or equal to 18"
}
}
}
}
})
MongoDB, yalnızca doğrulamadan geçen verilerin koleksiyona kaydedilmesini sağlar.
CRUD İşlemleri
MongoDB ile çalışmanın kalbinde dört temel işlem bulunur: create, read, update ve delete; yani kısaca CRUD.
CRUD'u yapabiliyorsanız, neredeyse her uygulamayı geliştirebilirsiniz. MongoDB bunu birkaç sezgisel yöntemle basitleştirir. Tek tek üzerinden geçelim.
Create
MongoDB'de bir koleksiyona yeni bir doküman eklemek için insertOne() yöntemini kullanırsınız. Örneğin, aşağıdaki kodla bir user koleksiyonu içine yeni bir kullanıcı dokümanı oluşturabiliriz.
db.users.insertOne({
name: "Alice",
email: "alice@example.com",
age: 25
})
MongoDB her oluşturulan doküman için benzersiz bir _id otomatik olarak üretir.
Read
Bir koleksiyondan veri okumak basittir. find() yöntemini kullanırız. Tüm dokümanları alabilir veya koşullarla filtreleyebiliriz. Aşağıdaki kod, bir kullanıcı koleksiyonundaki tüm kullanıcıları bulur.
// Find all users
db.users.find()
Benzersiz bir anahtarla—örneğin e-postayla—filtreleyebiliriz.
// Find one user by email
db.users.find({ email: "alice@example.com" })
find() her zaman yineleyebileceğiniz bir imleç (cursor) döndürür. Yalnızca tek bir eşleşme istiyorsanız indOne() kullanabilirsiniz.
Update
Veri oluşturulduktan sonra, onu değiştirme ihtiyacı doğacaktır. Verileri değiştirmek için ``` updateOne()``` yöntemi kullanılır. Bir filtre ve uygulanacak değişiklikleri belirtiriz.
// Update Alice’s age
db.users.updateOne(
{ email: "alice@example.com" },
{ $set: { age: 26 } }
)
$set operatörü yalnızca belirtilen alanı günceller ve dokümanın geri kalanını değiştirmeden bırakır.
Delete
Son olarak, deleteOne() veya deleteMany() ile dokümanları kaldırabiliriz. Aşağıdaki örnek bir deleteOne işlemidir.
// Delete Alice’s record
db.users.deleteOne({ email: "alice@example.com" })
Silme işlemlerinin kalıcı olduğunu unutmayın.
Yalnızca bu dört işlemlerle yapılacaklarla, yapılacaklar listesi uygulamalarından e-ticaret platformlarına kadar her şeyi inşa edebilirsiniz.
Güvenlik En İyi Uygulamaları
Güvenlik, söz konusu veritabanları olduğunda asla sonradan düşünülmemelidir. Bu doğrultuda, her başlangıç düzeyindeki kullanıcının bilmesi gereken temel en iyi uygulamalara bakalım.
Kimlik doğrulama ve yetkilendirme
Varsayılan olarak, yeni bir MongoDB kurulumu kimlik doğrulamayı zorunlu kılmayabilir. Bu da bağlanabilen herkesin potansiyel olarak verilerinize erişebileceği anlamına gelir. Bu, önlem alınmazsa büyük bir risk olabilir. MongoDB'nin açıkta kalmamasını sağlamak için kimlik doğrulama ve yetkilendirme uygulayabiliriz.
- Kimlik doğrulama yalnızca geçerli kullanıcıların bağlanmasını sağlar.
- Yetkilendirme ise kimliği doğrulanmış kullanıcıların bile yalnızca izin verilen işlemleri yapabilmesini sağlar.
Örneğin, her yerde root/admin kullanıcısıyla oturum açmak yerine, belirli görevler için özel kullanıcılar oluşturmalısınız.
// Create a new user with read-only access
db.createUser({
user: "reportViewer",
pwd: "strongPassword123",
roles: [ { role: "read", db: "salesDB" } ]
})
Artık bu kullanıcı salesDB içindeki verileri yalnızca okuyabilir; yazamaz veya silemez.
Rol tabanlı erişim kontrolü (RBAC)
MongoDB, kullanıcıların neler yapabileceğini yönetmek için roller kullanır. Bazı yerleşik roller şunlardır:
- Read: Bu ayrıcalığa sahip kullanıcılar yalnızca verileri görüntüleyebilir.
- ReadWrite: Bu ayrıcalığa sahip kullanıcılar verileri görüntüleyebilir ve değiştirebilir.
- DbAdmin: Bu ayrıcalığa sahip kullanıcılar indeksleri, istatistikleri ve profillemeyi yönetebilir.
- Root: Bu ayrıcalığa sahip kullanıcıların tam yetkisi vardır. Günlük işlerde kullanmaktan kaçının!
Asgari ayrıcalık ilkesini izlemek, bir kullanıcıya işini yapmak için gereken izinleri verirken MongoDB veritabanının güvenliğini sağlar.
Genel erişime maruz bırakmaktan kaçının
En yaygın başlangıç hatalarından biri, MongoDB'yi varsayılan bağlantı noktasında (27017) dinleyecek ve 0.0.0.0'a (tüm ağ arayüzleri) bağlanacak şekilde bırakmaktır.
Bu, veritabanınızın tüm internete açık olduğu anlamına gelir. Bunu önlemek için şu önlemleri almalısınız:
- MongoDB'yi yalnızca
localhost'a veya özel/iç IP'ye bağlayın. - Erişimi kısıtlamak için bir güvenlik duvarı (veya bulut güvenlik grubu) kullanın.
- Uzak erişim gerekiyorsa her zaman bir VPN veya SSH tüneli üzerinden bağlanın.
# Example: /etc/mongod.conf
net:
port: 27017
bindIp: 127.0.0.1 # Only accessible locally
Bu uygulamalarla, MongoDB kurulumunuz kazara veri sızıntılarına veya kötü niyetli saldırılara karşı çok daha güvenli olacaktır.
Sonuç
MongoDB, esnekliği ve gücü sayesinde modern uygulamalar için en iyi veritabanlarından biri olmayı hak etmiştir. İster bir yan proje ile uğraşıyor olun ister büyük ölçekli bir sistemi yönetin, temellere sağlam şekilde hâkim olmak size çok zaman kazandırır ve daha üretken olmanıza yardımcı olur. Bu makalede, MongoDB ile çalışırken bir başlangıç düzeyindeki kullanıcının bilmesi gereken yedi temel kavramı inceledik. Bunlar şunlardır:
- NoSQL ve doküman veritabanlarını anlamak.
- MongoDB mimarisi temelleri.
- BSON ve veri türleri.
- Şema tasarım ilkeleri.
- Veri doğrulama.
- CRUD işlemleri.
- Güvenlik en iyi uygulamaları.
Yukarıdaki kavramları iyi anlamak, MongoDB ile çalışırken size güçlü bir temel sağlar. Daha fazla ayrıntı için MongoDB Dokümantasyonu ve DataCamp'in Python ile MongoDB'ye Giriş kursuna göz atmayı unutmayın.
SSS
NoSQL ve SQL veritabanları arasındaki fark nedir?
MongoDB gibi NoSQL veritabanları verileri esnek, doküman odaklı biçimlerde saklarken, SQL veritabanları sabit şemalı, yapılandırılmış tablolar kullanır.
MongoDB’nin mimarisi nasıl çalışır?
MongoDB, yüksek erişilebilirlik için replika setleri ve yatay ölçekleme için sharding gibi bileşenlerle dağıtık ve ölçeklenebilir bir mimari kullanır.
BSON nedir ve MongoDB neden kullanır?
BSON (Binary JSON), MongoDB'nin veri formatıdır; JSON benzeri dokümanları verimli şekilde depolamak ve ek veri türlerini desteklemek için tasarlanmıştır.
MongoDB’de şema tasarımı neden önemlidir?
MongoDB şemasız olsa da, düşünülmüş bir şema tasarımı verimli sorgular, azalan tekrar ve daha iyi uygulama performansı sağlar.
Yeni başlayan biri olarak MongoDB veritabanımı nasıl güvenli hâle getirebilirim?
Kimlik doğrulamayı etkinleştirebilir, rol tabanlı erişim kontrolü kullanabilir, TLS/SSL bağlantılarını zorunlu kılabilir ve güvenlik açıklarına karşı düzenli olarak MongoDB'yi güncelleyebilirsiniz.

Yazılım Mühendisi
