MongoDB, modern uygulama geliştiricileri için tasarlanmış, doküman tabanlı (document-oriented) bir NoSQL veritabanıdır. Esnek şema yapısı, yatay ölçeklenebilirliği ve JSON benzeri veri formatı sayesinde günümüzün en çok tercih edilen veritabanlarından biri haline gelmiştir. Bu yazıda MongoDB'nin temellerini, kurulumdan CRUD işlemlerine kadar adım adım ele alacağız.
MongoDB Nedir?
MongoDB, verileri satır ve sütunlardan oluşan tablolar yerine, BSON (Binary JSON) formatında, esnek şemalı dokümanlar halinde saklayan bir NoSQL veritabanıdır. İlişkisel veritabanlarının aksine önceden katı bir şema tanımlamanız gerekmez; her doküman kendi alanlarına sahip olabilir.
Neden MongoDB Kullanılır?
- Esnek şema: Dokümanlar farklı alanlara sahip olabilir, uygulama geliştikçe şema kolayca değişebilir.
- Ölçeklenebilirlik: Sharding ile yatay olarak kolayca ölçeklenir.
- Performans: İndeksleme ve gömülü (embedded) dokümanlar sayesinde ilişkili verilere tek sorguda erişilebilir.
- JSON uyumluluğu: JavaScript/Node.js uygulamalarıyla doğal bir uyum sağlar.
Temel Kavramlar
MongoDB'de veriler üç seviyede organize edilir:
- Database: Koleksiyonları barındıran en üst düzey yapı.
- Collection: İlişkisel veritabanlarındaki tabloya benzer, dokümanları barındırır.
- Document: BSON formatında saklanan, JSON'a benzer tek bir veri kaydı.
{
"_id": ObjectId("651f3c2e8f1b2c3a4d5e6f7a"),
"name": "Ertuğrul Mert",
"role": "Self-Taught Developer",
"skills": ["Node.js", "MongoDB", "Next.js"]
}
Kurulum
MongoDB'yi yerel makinenize kurmak için resmi paket yöneticilerini kullanabilir ya da MongoDB Atlas ile bulut üzerinde ücretsiz bir küme oluşturabilirsiniz.
# macOS (Homebrew)
brew tap mongodb/brew
brew install mongodb-community
# Ubuntu / Debian
sudo apt-get install -y mongodb-org
# Docker ile hızlı kurulum
docker run -d -p 27017:27017 --name mongodb mongo:latest
MongoDB'ye Bağlanma
Kurulumdan sonra mongosh komut satırı aracıyla veritabanına bağlanabilirsiniz:
mongosh "mongodb://localhost:27017"
Node.js tarafında ise resmi sürücüyü kullanarak bağlanabilirsiniz:
npm install mongodb
import { MongoClient } from "mongodb";
const client = new MongoClient("mongodb://localhost:27017");
await client.connect();
const db = client.db("portfolio");
const users = db.collection("users");
CRUD İşlemleri
MongoDB'de temel işlemler Create, Read, Update ve Delete olarak dörde ayrılır.
Create (Ekleme)
db.users.insertOne({
name: "Ertuğrul Mert",
age: 20,
role: "Developer"
});
db.users.insertMany([
{ name: "Ertuğrul Mert", role: "Developer" },
{ name: "Utku Kösem", role: "Designer" }
]);
Read (Okuma)
// Tüm dokümanları getir
db.users.find();
// Koşula göre filtrele
db.users.find({ role: "Developer" });
// Tek bir doküman getir
db.users.findOne({ name: "Ertuğrul Mert" });
Update (Güncelleme)
db.users.updateOne(
{ name: "Ertuğrul Mert" },
{ $set: { role: "Full-Stack Developer" } }
);
db.users.updateMany(
{ role: "Developer" },
{ $inc: { age: 1 } }
);
Delete (Silme)
db.users.deleteOne({ name: "Utku Kösem" });
db.users.deleteMany({ role: "Developer" });
Sorgu Operatörleri
MongoDB, karmaşık filtreleme için zengin bir operatör kümesi sunar:
// Karşılaştırma operatörleri
db.users.find({ age: { $gt: 18 } }); // büyüktür
db.users.find({ age: { $lte: 25 } }); // küçük eşit
// Mantıksal operatörler
db.users.find({
$or: [{ role: "Developer" }, { role: "Designer" }]
});
// Dizi içinde arama
db.users.find({ skills: { $in: ["MongoDB", "Node.js"] } });
İndeksleme
Sorgu performansını artırmak için sık kullanılan alanlara indeks eklenebilir:
db.users.createIndex({ name: 1 }); // artan sıralı indeks
db.users.createIndex({ email: 1 }, { unique: true });
Aggregation Framework
Aggregation pipeline, verileri adım adım işleyip dönüştürmenizi sağlar:
db.users.aggregate([
{ $match: { role: "Developer" } },
{ $group: { _id: "$role", total: { $sum: 1 } } },
{ $sort: { total: -1 } }
]);
Veri Modelleme: Embedding vs Referencing
İlişkili verileri modellerken iki temel yaklaşım vardır:
- Embedding (Gömme): İlişkili veriyi aynı doküman içine gömmek. Sık birlikte okunan, küçük veriler için idealdir.
- Referencing (Referanslama): Verileri ayrı koleksiyonlarda tutup
_idile ilişkilendirmek. Büyük veya sık güncellenen veriler için tercih edilir.
// Embedding örneği
{
name: "Ertuğrul Mert",
address: { city: "İstanbul", country: "Türkiye" }
}
// Referencing örneği
{
name: "Ertuğrul Mert",
addressId: ObjectId("651f3c2e8f1b2c3a4d5e6f7b")
}
Sonuç
MongoDB, esnek şema yapısı ve güçlü sorgu diliyle modern uygulamalar için pratik bir veritabanı çözümü sunar. Temel CRUD işlemlerini ve aggregation framework'ünü öğrendikten sonra, kendi projelerinizde rahatlıkla kullanmaya başlayabilirsiniz.