Bölüm 1: MongoDB Nedir?

MongoDB; geleneksel ilişkisel veritabanlarının (RDBMS) sunduğu katı tablo yapısının aksine, NoSQL (Not Only SQL) mimarisini benimseyen, belge/doküman (document) tabanlı bir veritabanıdır. Verileri esnek, JSON benzeri belgeler halinde depolar. Bu 'şemasız' (schemaless) yapı, verilerinizi uygulama kodunuzun kullandığı nesne yapısıyla birebir eşleştirmenize olanak tanır. Böylece veri modelinizi projenizin ihtiyaçlarına göre kesinti yaşamadan geliştirebilir, hızlıca yineleyebilir ve tekdüze olmayan verileri kolayca işleyebilirsiniz.

MongoDB’nin ilişkisel veritabanlarından en büyük farkı; her kaydın BSON (Binary JSON) formatında saklanmasıdır diyebiliriz. Doküman tabanlı olan NoSQL veritabanları verileri tablo olarak değil, doküman olarak saklar ve her dokümanın birbirinden farklı alanlara sahip olmasına olanak sağlayarak büyük bir esneklik sağlarlar.

Bölüm 2: Temel Kavramlar

MongoDB’deki temel kavramları aşağıdaki tabloda bulabilirsiniz. SQL bilip NoSQL öğrenmek isteyenler için; kavramların SQL’de denk geldikleri ifadelere yer verilmiş olsa da birebir karşılık gelmediklerini, teknik farklılıklar içerdiklerini göz önünde bulundurmak gerekiyor.

TerimAçıklamaSQL Karşılığı
DocumentVeri anlamında tek bir kaydı ifade eder. Sadece veri değil, kendi şemasını da içinde taşır. İç içe geçmiş (nested) objeler ve diziler barındırabilir.Row
CollectionDokümanların bir arada tutulduğu birim. "Şemasız" (Schema-less) bir yapıdır. Aynı koleksiyondaki iki doküman tamamen farklı alanlara sahip olabilir.Table
DatabaseCollection’ların fiziksel ve mantıksal olarak gruplandığı en üst birimdir.Database
FieldDoküman içindeki alanlar. Sütunlar gibi önceden tanımlanmaz. Veri tipi (tarih, sayı, metin) her dokümanda dinamik olarak değişebilir.Column
_idMongoDB'nin ID yapısıdır ve Zaman damgası, Makine ID'si, Proses ID'si ve Counter kombinasyonundan oluşur. Böylece farklı sunucularda bile çakışma yaşanmaz.Auto Increment ID

Bölüm 3: Ortam Kurulumu

MongoDB yalnızca arka planda çalışan bir veri tabanı motoru değil; geliştirme süreçlerini hızlandıran, farklı ihtiyaçlara hitap eden geniş bir araç ekosistemidir. Veri tabanını ayağa kaldırmak ve yönetmek için temel olarak üç ana yol izleyebiliriz:

3.1. MongoDB Atlas: Bulut Tabanlı (Cloud) Çözüm

Günümüz modern mimarilerinde en çok tercih edilen yöntemdir. "Database-as-a-Service" (DBaaS) modeliyle çalışan Atlas, sunucu kurulumu veya bakımıyla uğraşmadan, bir web arayüzü üzerinden veri tabanı oluşturmanıza olanak tanır. Erişim kolaylığı açısından öğrenme aşaması ve küçük projeler için sunduğu ücretsiz opsiyonu ile ideal pozisyondadır. Yedekleme, güvenlik ve ölçekleme işlemleri otomatik olarak yönetilir.

Başlangıç için AWS, Google Cloud veya Azure üzerinden MongoDB Atlas edinerek tamamen ücretsiz (M0) bir paketle dakikalar içinde MongoDB kullanmaya başlayabilirsiniz. İhtiyacınız olan işlem gücü ve depolama gereksinimi arttıkça sunulan ücretli çözümlere de göz atabilirsiniz.

[Görsel Yerleşkesi: GCP - AWS Bulut Altyapı Şeması]

3.2. MongoDB Compass: Görsel Yönetim Arayüzü (GUI)

Veri tabanındaki dokümanları bir Excel tablosu rahatlığında incelemek, sorgular yazmak ve veri şemalarını analiz etmek için geliştirilmiş resmi masaüstü uygulamasıdır. Karmaşık JSON yapılarını görselleştirerek kullanım kolaylığı sağlamasının yanı sıra sunduğu arayüz ile işlemlerinizi hızlıca halletmenize olanak tanır.

[Görsel Yerleşkesi: MongoDB Compass Arayüzü Ekran Görüntüsü]

3.3. MongoDB Community Server & Mongosh (Shell)

Veri tabanı motorunun doğrudan kendi makinenize (Local) veya bir uzak sunucuya kurulmasıdır. Bunun için ellerinizi biraz kirletmeniz gerekse de Atlas ve Compass de sonuç olarak bu motoru kullanır.

MongoDB ile terminal üzerinden hükmetmemizi sağlayan Mongosh adı verilen kabuk (shell); veritabanına hükmetmenizi sağlayan JavaScript tabanlı bir elçidir.

MongoDB Community Server nasıl kurulur hızlıca inceleyelim ve perde arkasında neler var görelim. Size bunu aktarabilmek için Ubuntu 22.04 (Jammy) bir işletim sistemine sahip bir bilgisayar kullanıyor olacağım.

Bilgisayarınızda mevcut değilse gnupg (şifreleme ve doğrulama aracı) ve curl (veri transfer aracı) yükleyerek başlayalım.

Terminal
bash
sudo apt-get install gnupg curl

MongoDB için bir public GPC key edinelim. Linux dünyasında paket yüklemeden önce, indireceğiniz paketlerin gerçekten MongoDB tarafından gönderildiğini doğrulamanız gerekir.

Terminal
bash
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor

Liste dosyasını oluşturalım. Ubuntu'nun standart kütüphanelerinde MongoDB'nin en güncel versiyonu her zaman bulunmaz. Bu yüzden işletim sistemimize "MongoDB paketlerini nereden bulacağını" söylememiz gerekir.

Terminal
bash
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list
Eğer Ubuntu 22.04 yerine farklı bir Ubuntu sürümü (örneğin 24.04) kullanıyorsanız, liste dosyası oluştururken yazdığımız jammy kod adını kendi sürümünüzün kod adıyla (örn: noble) değiştirmeniz gerekir. Aksi halde paket deposu bulunamayacaktır.

Yerel paket listesini güncelleyerek yeni eklediğimiz depoyu tarayalım.

Terminal
bash
sudo apt-get update

Artık MongoDB Community Server yüklemeye hazırız.

Terminal
bash
sudo apt-get install -y mongodb-org

Kurulum bittiğinde MongoDB hemen çalışmaya başlamaz. Onu bir "arka plan servisi" olarak ayağa kaldırmamız gerekir.

Terminal
bash
sudo systemctl start mongod

Son olarak bilgisayar her açıldığında MongoDB’nin otomatik başlatılması için gerekli ayarlamaları yapalım.

Terminal
bash
sudo systemctl enable mongod

Bilgisayarımızda MongoDB’nin durumunu kontrol etmek için aşağıdaki komutu kullanabiliriz.

Terminal
bash
sudo systemctl status mongod

Kurulumu tamamladık ve artık bilgisayarımızda MongoDB Community Server bulunuyor. Kurulum esnasında herhangi bir sorun ile karşılaşmanız durumunda MongoDB’nin sağladığı dokümanlarda çözüm arayabilirsiniz.

4. Uygulamalı CRUD İşlemleri

MongoDB’de veriler ile ilgili işlemler gerçekleştirmek için JavaScript tabanlı bir dil kullanıyoruz. Şimdi birlikte uygulamalı olarak CRUD (create, read, update, delete) işlemlerini gerçekleştirelim.

Size bu örneği aktarabilmek için aşağıdaki küçük bir örneğini paylaştığım veri setini kullanacağım. Verinin tamamına ulaşmak için bu bağlantıyı kullanabilirsiniz.

TarihYerBüyüklük (Mw)Derinlik (km)KoordinatŞehir
2024-03-01 10:15Marmara Denizi4.212.528.97, 40.85İstanbul
2024-03-01 12:30Seferihisar Açıkları3.810.226.85, 38.10İzmir
2024-03-01 14:05Pütürge4.57.038.85, 38.25Malatya
2024-03-01 16:45Gökova Körfezi3.55.427.50, 36.95Muğla
2024-03-02 01:20Antakya2.915.036.15, 36.20Hatay
2024-03-02 04:55Sulusaray4.19.836.05, 40.05Tokat
2024-03-02 08:12Ayvacık3.211.126.40, 39.50Çanakkale
2024-03-02 11:30Sivrice3.98.539.30, 38.45Elazığ
2024-03-02 15:20Onikişubat4.810.036.90, 37.60K.Maraş
2024-03-03 02:40Gemlik Körfezi3.113.229.15, 40.42Bursa

MongoDB’de komut yazmaya başlamadan önce işlem yapılmak istenen veritabanı seçilmelidir. Bunun için use anahtar kelimesini kullanırız.

mongosh
javascript
use earthquake_db

Veri Ekleme (Create)

MongoDB’de create yani kayıt ekleme işlemi için iki seçenek bulunuyor. Bir tek kayıt ekleyeceğimiz durumda insertOne, birden fazla kaydı tek seferde eklemek için insertMany fonksiyonlarını kullanabiliriz.

MongoDB'de veri eklediğimizde, eğer veritabanı veya koleksiyon henüz yoksa MongoDB bunları otomatik olarak oluşturur.
mongosh
javascript
// Tek bir deprem kaydı ekleyelim (insertOne)
db.events.insertOne({
date: new Date("2024-03-01T10:15:00"),
place: "Marmara Denizi",
magnitude: 4.2,
depth: 12.5,
location: { type: "Point", coordinates: [28.97, 40.85] },
city: "İstanbul"
})
// Birden fazla kaydı tek seferde ekleyelim (insertMany)
db.earthquakes.insertMany([
{
date: new Date("2024-03-01T10:15:00"),
place: "Marmara Denizi",
magnitude: 4.2,
depth: 12.5,
location: { type: "Point", coordinates: [28.97, 40.85] },
city: "İstanbul"
},
{
date: new Date("2024-03-01T12:30:00"),
place: "Seferihisar Açıkları",
magnitude: 3.8,
depth: 10.2,
location: { type: "Point", coordinates: [26.85, 38.10] },
city: "İzmir"
},
{
date: new Date("2024-03-01T14:05:00"),
place: "Pütürge",
magnitude: 4.5,
depth: 7.0,
location: { type: "Point", coordinates: [38.85, 38.25] },
city: "Malatya"
}
])
Fark ettiyseniz location alanını bir nesne olarak ekledik. SQL'de bu işlem için ek tablo veya karmaşık kolonlar gerekirken, MongoDB'de veriyi olduğu gibi "gömüyoruz" (Embedding).

Veri Okuma (Read)

Veriyi ekledik, şimdi görmek istediğimiz spesifik kayıtları nasıl filtreleyebiliriz ona bakalım. Burada find metodunun gücünden faydanacağız. Tüm kayıtları görüntülemek için aşağıdaki yöntemi kullanabiliriz.

mongosh
javascript
db.events.find()

MongoDB’de filtreleme için nesnelerden yararlanıyoruz. Sadece İstanbul’daki depremleri görüntülemek için;

mongosh
javascript
db.events.find({ city: "İstanbul" })

Büyüklüğü 4.0’dan büyük olan kayıtları görüntülemek için aşağıdaki sorguyu kullanabiliriz.

mongosh
javascript
db.events.find({ magnitude: { $gt: 4.0 } })

MongoDB’de karşılaştırma operatörleri SQL tarafından farklıdır. MongoDB’de karşılaştırma yapmak için bazı anahtarlara ihtiyaç duyarız, bu anahtarları, diğer bir deyiş ile karşılaştırma operatörlerini, aşağıdaki tabloda örnekleri ile sunuyorum.

OperatörAnlamıAçıklamaÖrnek (mongosh)
$eqEqualEşittir{ city: { $eq: "İstanbul" } }
$neNot EqualEşit Değildir{ city: { $ne: "İzmir" } }
$gtGreater ThanBüyüktür{ magnitude: { $gt: 5.0 } }
$gteGreater Than or EqualBüyük veya Eşittir{ magnitude: { $gte: 4.0 } }
$ltLess ThanKüçüktür{ depth: { $lt: 10 } }
$lteLess Than or EqualKüçük veya Eşittir{ depth: { $lte: 7.5 } }
$inInListe içindekilerden biri{ city: { $in: ["Bursa", "Sakarya"] } }
$ninNot InListe içinde olmayanlar{ city: { $nin: ["İstanbul", "Ankara"] } }
Aslında basit sorgularda (örneklerimiz arasında yer alan { city: "İstanbul" } gibi) MongoDB arka planda gizli bir $eq kullanır.

Veri Güncelleme (Update)

Diyelim ki bir kayıtta güncellemeye ihtiyaç olduğunu fark ettiniz. Veri eklemede olduğu gibi burada da iki farklı metot elimizde bulunuyor; updateOne ve updateMany ile gerekli işlemleri gerçekleştirebiliriz.

mongosh
javascript
// Belirli bir kaydı güncelle (updateOne)
db.events.updateOne(
{ place: "Pütürge" }, // Hangi kayıt? (Filtre)
{ $set: { depth: 8.2 } } // Ne değişecek? (Operatör)
)
// Çoklu güncelleme: Tüm İstanbul kayıtlarına 'risk_zone: 1' alanı ekle
db.events.updateMany(
{ city: "İstanbul" },
{ $set: { risk_zone: 1 } }
)
Dikkat! Update ve Delete işlemlerinde SQL tarafında olduğu gibi veriyi filtrelemezseniz tüm veri sorgunuzdan etkilenir veya beklenmedik ezilmeler yaşanabilir.

Veri Silme (Delete)

Artık ihtiyacınız olmayan veya hatalı girilmiş verileri sistemden temizleyelim.

mongosh
javascript
// Tek bir kaydı sil
db.events.deleteOne({ place: "Seferihisar Açıkları" })
// Belirli bir kriterdeki tüm kayıtları sil (Örn: 3.0 altındaki önemsiz sarsıntılar)
db.events.deleteMany({ magnitude: { $lt: 3.0 } })

6. Sonuç ve Özet

MongoDB dünyasına attığımız bu ilk adımda, NoSQL’in esnek yapısından kurulum süreçlerine, CRUD operasyonlarına kadar geniş bir yelpazeyi taradık. Peki, tüm bu öğrendiklerimizin ışığında: Neden ve ne zaman MongoDB?

  • Hızlı Prototipleme: Veri şemanızın (tablo yapınızın) henüz netleşmediği, sürekli değiştiği projelerde SQL'in katı kurallarıyla vakit kaybetmeden doğrudan koda odaklanmak için.
  • Büyük Veri ve Yatay Ölçekleme: Veriniz tek bir sunucuya sığmayacak kadar büyüdüğünde (örneğin milyonlarca satırlık borsa veya sensör verileri), veriyi kolayca dağıtmak (Sharding) için.
  • Değişken Şema: Her kaydın (dökümanın) birbirinden farklı alanlara sahip olabildiği, esnek veri modellerinde (E-ticaret ürün özellikleri, sosyal medya içerikleri vb.).
  • Bir Sonraki Adım: Verinin Gücünü Keşfetmek

    CRUD işlemleriyle veriyi kaydetmeyi ve çekmeyi öğrendik. Ancak veriyi sadece saklamak yetmez; ondan anlamlı sonuçlar çıkarmak gerekir. Örneğin:

    "Son 1 ayda İstanbul'da gerçekleşen depremlerin ortalama büyüklüğü nedir?"
    "Hangi şehirde, hangi derinlikte daha fazla sarsıntı yaşanıyor?"

    İşte bu tür karmaşık analizleri ve veri dönüştürme işlemlerini yapmamızı sağlayan devasa bir motor var: Aggregation Framework (Veri Toplama ve Analiz Hattı). Bir sonraki yazımda, verileri bir fabrikadaki bant sistemi gibi işleyip rafine ettiğimiz bu "Pipeline" yapısını derinlemesine inceleyeceğiz.

    7. Kapanış

    MongoDB’nin sunduğu bu esnek yapıyı ben de şu an aktif olarak geliştirdiğim Streamline ETL projemde, farklı kaynaklardan elde ettiğim verileri dinamik olarak işlemek ve depolamak için kullanıyorum. Veri mühendisliği süreçlerine, büyük veri setlerini yönetmeye veya Streamline projemin teknik detaylarına ilginiz varsa, fikir alışverişinde bulunmak için benimle İletişim sayfam üzerinden her zaman iletişime geçebilirsiniz. Sizin ilk MongoDB projeniz ne olacak?