JavaScript ile backend geliştirmeye yeni başlayan biri için en büyük engellerden biri, verileri nasıl depolayacağına karar vermekti. SQL’in tablo tabanlı yapısından NoSQL’in esnekliğine kadar birçok görüş vardı ama ben MongoDB ile tanıştığımda aydınlandım. MongoDB’nin sunduğu belge odaklı yapı, veri tabanınızı JavaScript nesnelerine benzetiyor ve sorgu dilini de doğal olarak JavaScript’e çeviriyor. Bu da yeni başlayanlar için öğrenme eğrisini oldukça yumuşatıyor.
const kullanici = { ad: "Ayşe", eposta: "ayse@example.com", yas: 30 };Bu nesne, neredeyse hiçbir dönüştürme katmanı olmadan doğrudan veritabanında saklanabiliyor. Yani bir kullanicilar tablosuna veri eklerken karşılaşılan "bu kolon hangi alana denk geliyor?" gibi sorularla uğraşmak zorunda kalmıyorsunuz. MongoDB, veriyi tam da JavaScript’te düşündüğünüz şekilde tutuyor ve bu da başlangıçta büyük bir avantaj sağlıyor.
MongoDB Nedir ve Neden Farklı?
MongoDB, ilişkisel veritabanlarından (MySQL, PostgreSQL gibi) farklı olarak belge tabanlı bir veritabanıdır. İlişkisel veritabanlarında veriler tablolarda satır ve sütunlar halinde tutulurken, MongoDB’de veriler JSON benzeri belgeler olarak saklanır. Bu belgeler, koleksiyonlar adı verilen gruplar altında toplanır — tıpkı tabloların yerini alıyorlar.
Örneğin, bir kullanicilar koleksiyonunda her belge farklı bir yapıya sahip olabilir:
- Bir kullanıcıda
telefonalanı olabilirken, diğerinde olmayabilir. - Bir kullanıcıda iç içe
adresnesnesi bulunurken, diğeri sadece temel bilgileri içerebilir.
MongoDB, bu esnekliğiyle özellikle geliştirme aşamasının erken dönemlerinde oldukça kullanışlıdır. Veri ihtiyaçlarınız netleşene kadar alan eklemek, silmek ya da değiştirmek için herhangi bir göçürüm (migration) script’ine ihtiyaç duymuyorsunuz. Gereksinimler her hafta değişirken, bu esneklik projelerinizin hız kazanmasına yardımcı oluyor.
Ancak bu esneklik beraberinde bazı riskleri de getiriyor. Örneğin:
- Aynı kavramı temsil eden alanlar farklı geliştiriciler tarafından farklı isimlerle saklanabilir (
epostayerineemail). - Bir alana sayı yerine metin olarak veri kaydedilebilir ve bu hatayı ancak veriyi okumaya çalıştığınızda fark edersiniz.
İşte bu noktada Mongoose devreye giriyor.
Node.js Uygulamanızda MongoDB’yi Doğrudan Kullanmamalısınız
MongoDB’nin resmi Node.js sürücüsüyle doğrudan bağlantı kurup sorgular çalıştırabilirsiniz. Ancak bu yöntem, verilerinizi basit JavaScript nesneleri olarak döndürür ve tip güvenliği sağlamaz. Editörünüz alan adlarını otomatik dolduramaz, yazım hatalarını yakalayamaz veya veri tipi uyumsuzluklarını önceden bildiremez. Örneğin:
// Hatalı yazım: Yanlış alan adı
const kullanici = new Kullanici({ eMail: "test@example.com" }); // GeçerliBu durum, küçük projelerde sorun yaratmayabilir. Ancak birden fazla geliştiricinin çalıştığı ya da projenin aylar sonra bakım yapılacağı durumlarda, verilerin tutarlılığı kritik önem kazanıyor. İşte bu noktada Mongoose’un rolü devreye giriyor.
Mongoose, MongoDB’nin belge tabanlı yapısını JavaScript nesneleriyle eşleştiren bir ODM (Object Document Mapper) aracıdır. Temel özellikleri şunlardır:
- Şema tanımlama: Verilerinizin yapısını kodda belirleyerek tutarlılığı sağlar.
- Doğrulama: Alanlara uygun veri tiplerinin girilmesini garanti eder.
- Yöntemler: Belgeler üzerinde çalışacak özel fonksiyonları eklemenize olanak tanır.
- Kancalar (hooks): Veri kaydetme, güncelleme ya da silme işlemlerinden önce/sonra çalışacak kod parçalarını tanımlayabilirsiniz.
- Sorgulama API’si: MongoDB’nin sorgulama dilini daha okunabilir ve yönetilebilir hale getirir.
MongoDB Bağlantısını Kurmak
Mongoose kullanmadan önce MongoDB veritabanınıza bağlantı kurmanız gerekiyor. Mongoose, bağlantı yönetimini basitleştirerek sadece bir kez bağlantı kurmanızı ve tüm modellerinizin bu bağlantıyı kullanmasını sağlıyor.
Öncelikle db.js adlı bir dosya oluşturarak bağlantı fonksiyonunu tanımlayalım:
// db.js
import mongoose from 'mongoose';
async function veritabaniBaglantisiKur() {
try {
await mongoose.connect(process.env.MONGO_URI);
console.log('MongoDB bağlantısı başarılı');
} catch (hata) {
console.error('MongoDB bağlantısı başarısız:', hata);
process.exit(1);
}
}
export default veritabaniBaglantisiKur;Ardından, sunucunuzu başlatan dosyada (server.js) bu bağlantıyı çağırabilirsiniz:
// server.js
import 'dotenv/config';
import veritabaniBaglantisiKur from './db.js';
async function sunucuyuBaslat() {
await veritabaniBaglantisiKur();
}
sunucuyuBaslat();Bağlantı dizesi, MongoDB veritabanınızın adresini içerir. Yerel geliştirme için genellikle mongodb://localhost:27017/projeadi şeklindedir. MongoDB Atlas kullanıyorsanız, bağlantı dizesi Atlas panelinden alınabilir. Önemli: Bağlantı dizesini .env dosyasında saklayın ve asla Git’e commit etmeyin.
Bir Şema Oluşturmak ve Kullanmak
Mongoose ile çalışmanın ilk adımı, verilerinizin yapısını tanımlayan bir şema oluşturmaktır. Bu şema, hangi alanların hangi veri tiplerine sahip olacağını belirler. Örneğin, bir yemek sipariş uygulaması için kullanıcı modelini oluşturalım:
// user/user.model.js
import { Schema, model } from 'mongoose';
const kullaniciSema = new Schema({
ad: String,
eposta: String,
telefon: String,
yas: Number,
rol: String,
etkin: Boolean,
});
export const Kullanici = model('User', kullaniciSema);model() fonksiyonu, şemanızı kullanıma hazır hale getirir. İlk parametre olan 'User', MongoDB koleksiyonunun adını belirler. Mongoose otomatik olarak ismi çoğul ve küçük harfe çevirir, böylece veriler users koleksiyonuna kaydedilir.
Modeli kullanmak, nesne tabanlı programlama prensiplerine benzer:
import { Kullanici } from './models/User.js';
async function kullaniciOlustur() {
const yeniKullanici = new Kullanici({
ad: 'Mehmet Yılmaz',
eposta: 'mehmet@example.com',
telefon: '5551234567',
yas: 30,
});
await yeniKullanici.save();
console.log(yeniKullanici._id); // MongoDB otomatik olarak benzersiz bir ID oluşturur
}
kullaniciOlustur();Mongoose’un sağladığı bu yapı, projelerinizin büyümesiyle birlikte veri tutarlılığını korumanızı ve geliştirme sürecini daha güvenilir hale getiriyor. MongoDB’nin esnekliğinden faydalanırken, aynı zamanda tip güvenliği ve doğrulama gibi kritik özellikleri de eklemenizi sağlıyor.
Yapay zeka özeti
MongoDB’nin belge tabanlı yapısını Mongoose ile nasıl daha yönetilebilir hale getirebilirsiniz? JavaScript geliştiricileri için veritabanı şemaları, doğrulama ve tip güvenliği rehberi.