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.
| Terim | Açıklama | SQL Karşılığı |
|---|---|---|
| Document | Veri 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 |
| Collection | Dokü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 |
| Database | Collection’ların fiziksel ve mantıksal olarak gruplandığı en üst birimdir. | Database |
| Field | Doküman içindeki alanlar. Sütunlar gibi önceden tanımlanmaz. Veri tipi (tarih, sayı, metin) her dokümanda dinamik olarak değişebilir. | Column |
| _id | MongoDB'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.
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.
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.
sudo apt-get install gnupg curlMongoDB 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.
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmorListe 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.
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.listjammy 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.
sudo apt-get updateArtık MongoDB Community Server yüklemeye hazırız.
sudo apt-get install -y mongodb-orgKurulum bittiğinde MongoDB hemen çalışmaya başlamaz. Onu bir "arka plan servisi" olarak ayağa kaldırmamız gerekir.
sudo systemctl start mongodSon olarak bilgisayar her açıldığında MongoDB’nin otomatik başlatılması için gerekli ayarlamaları yapalım.
sudo systemctl enable mongodBilgisayarımızda MongoDB’nin durumunu kontrol etmek için aşağıdaki komutu kullanabiliriz.
sudo systemctl status mongodKurulumu 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.
| Tarih | Yer | Büyüklük (Mw) | Derinlik (km) | Koordinat | Şehir |
|---|---|---|---|---|---|
| 2024-03-01 10:15 | Marmara Denizi | 4.2 | 12.5 | 28.97, 40.85 | İstanbul |
| 2024-03-01 12:30 | Seferihisar Açıkları | 3.8 | 10.2 | 26.85, 38.10 | İzmir |
| 2024-03-01 14:05 | Pütürge | 4.5 | 7.0 | 38.85, 38.25 | Malatya |
| 2024-03-01 16:45 | Gökova Körfezi | 3.5 | 5.4 | 27.50, 36.95 | Muğla |
| 2024-03-02 01:20 | Antakya | 2.9 | 15.0 | 36.15, 36.20 | Hatay |
| 2024-03-02 04:55 | Sulusaray | 4.1 | 9.8 | 36.05, 40.05 | Tokat |
| 2024-03-02 08:12 | Ayvacık | 3.2 | 11.1 | 26.40, 39.50 | Çanakkale |
| 2024-03-02 11:30 | Sivrice | 3.9 | 8.5 | 39.30, 38.45 | Elazığ |
| 2024-03-02 15:20 | Onikişubat | 4.8 | 10.0 | 36.90, 37.60 | K.Maraş |
| 2024-03-03 02:40 | Gemlik Körfezi | 3.1 | 13.2 | 29.15, 40.42 | Bursa |
MongoDB’de komut yazmaya başlamadan önce işlem yapılmak istenen veritabanı seçilmelidir. Bunun için use anahtar kelimesini kullanırız.
use earthquake_dbVeri 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.
// Tek bir deprem kaydı ekleyelim (insertOne)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.
db.events.find()MongoDB’de filtreleme için nesnelerden yararlanıyoruz. Sadece İstanbul’daki depremleri görüntülemek için;
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.
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ör | Anlamı | Açıklama | Örnek (mongosh) |
|---|---|---|---|
$eq | Equal | Eşittir | { city: { $eq: "İstanbul" } } |
$ne | Not Equal | Eşit Değildir | { city: { $ne: "İzmir" } } |
$gt | Greater Than | Büyüktür | { magnitude: { $gt: 5.0 } } |
$gte | Greater Than or Equal | Büyük veya Eşittir | { magnitude: { $gte: 4.0 } } |
$lt | Less Than | Küçüktür | { depth: { $lt: 10 } } |
$lte | Less Than or Equal | Küçük veya Eşittir | { depth: { $lte: 7.5 } } |
$in | In | Liste içindekilerden biri | { city: { $in: ["Bursa", "Sakarya"] } } |
$nin | Not In | Liste içinde olmayanlar | { city: { $nin: ["İstanbul", "Ankara"] } } |
{ 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.
// Belirli bir kaydı güncelle (updateOne)Veri Silme (Delete)
Artık ihtiyacınız olmayan veya hatalı girilmiş verileri sistemden temizleyelim.
// Tek bir kaydı sil6. 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?
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:
İş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?