Mongoose Şemaları, Modelleri ve Sanal Özellikleri
Öğrenenler, tür, doğrulama ve varsayılan seçeneklerle Mongoose şemaları tanımlayacak, modeller oluşturacak ve sanal özellikler ekleyeceklerdir.
Mongoose Şemaları, Modelleri ve Sanal Özellikleri, CoddyKit'te ücretsiz bir MongoDB Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, MongoDB Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. MongoDB Academy kursu toplamda 4 dersten oluşur.
Mongoose Nedir?
Mongoose, MongoDB ve Node.js için bir Object Document Mapper (ODM)'dır. Resmi MongoDB sürücüsünün üzerinde çalışır ve bir soyutlama katmanı ekler: belge yapısını doğrulamak için şemalar, veritabanıyla etkileşim için modeller, işlem öncesi ve sonrası mantık için ara yazılım kancaları ve hesaplanan alanlar için sanal alanlar. Mongoose, Node.js ekosistemindeki en popüler MongoDB kütüphanesidir ve özellikle iyi tanımlanmış veri modellerine sahip sunucu uygulamalarında üretkenlik sağlar.
// Install Mongoose
// npm install mongoose
const mongoose = require('mongoose');
// Connect to MongoDB
await mongoose.connect(process.env.MONGODB_URI);
console.log('Mongoose connected to MongoDB');Şema Tanımlama
Bir Mongoose Schema'sı, koleksiyondaki belgelerin yapısını, türlerini ve kısıtlamalarını tanımlar. Şemadaki her anahtar, bir belge alanına karşılık gelir. Her alan için tür, zorunluluk, varsayılan değer, minimum, maksimum, enum ve diğer birçok doğrulama seçeneğini belirtebilirsiniz. Şemalar, Mongoose uygulamanızdaki belge yapısının tek gerçek kaynağıdır.
const { Schema } = mongoose;
const userSchema = new Schema({
name: {
type: String,
required: [true, 'Name is required'],
trim: true,
maxlength: 100
},
email: {
type: String,
required: true,
unique: true,
lowercase: true // automatically converts to lowercase before saving
},
age: {
type: Number,
min: [0, 'Age cannot be negative'],
max: 150
},
role: {
type: String,
enum: ['admin', 'user', 'guest'],
default: 'user'
},
createdAt: {
type: Date,
default: Date.now
}
});Şema Türleri: Desteklenen Türler
Mongoose, zengin bir şema türleri kümesini destekler. En yaygın türler String, Number, Date, Boolean, Buffer, mongoose.Schema.Types.ObjectId (başvurular için), Array ([Type] olarak gösterilir) ve Mixed'dir (herhangi bir değer, tür denetimi yoktur). Mongoose, bir Schema tanımını başka bir Schema'nın alan tanımının içine yerleştirerek iç içe şemaları (alt belgeleri) de destekler.
const { Schema } = mongoose;
const { ObjectId } = Schema.Types;
const orderSchema = new Schema({
customerId: { type: ObjectId, ref: 'User', required: true }, // reference to User model
items: [
{
productId: { type: ObjectId, ref: 'Product' },
quantity: { type: Number, min: 1 },
price: Number
}
],
total: Number,
status: { type: String, default: 'pending' },
metadata: Schema.Types.Mixed, // accepts any shape
tags: [String], // array of strings
shippedAt: Date
});Zaman Damgaları Seçeneği
Schema oluşturucusuna ikinci bağımsız değişken olarak { timestamps: true } geçirmek, Mongoose'un her belgede otomatik olarak yönetmesini sağlar: createdAt ve updatedAt alanlarını. createdAt ekleme sırasında bir kez ayarlanır, updatedAt ise her kaydetme işleminde güncellenir. Bu alanları el ile ayarlamanız gerekmez; Mongoose bunları şeffaf biçimde yönetir. Bu, üretimdeki tüm şemalar için en iyi uygulamadır.
const productSchema = new Schema(
{
name: { type: String, required: true },
price: { type: Number, required: true },
category: String,
stock: { type: Number, default: 0 }
},
{ timestamps: true } // adds createdAt and updatedAt automatically
);
// Documents will have:
// { name: 'Laptop', price: 999, createdAt: Date, updatedAt: Date }Model Oluşturma
Bir Model, bir Schema'dan derlenen oluşturucudur. Koleksiyondaki belgeleri sorgulamak ve yazmak için gereken arayüzü sağlar. Model oluşturmak için mongoose.model('ModelName', schema) çağrısını yapın; ilk bağımsız değişken koleksiyonun tekil adıdır (Mongoose bunu otomatik olarak çoğullaştırır: 'User' → 'users' koleksiyonu). Modeller bir kez oluşturulmalı ve modüller olarak dışa aktarılmalıdır.
// Define schema
const userSchema = new mongoose.Schema({
name: String,
email: { type: String, unique: true },
role: { type: String, default: 'user' }
}, { timestamps: true });
// Compile the model
const User = mongoose.model('User', userSchema);
// This creates/uses the 'users' collection
module.exports = User;
// Usage in another file:
// const User = require('./models/user');
// const user = await User.findOne({ email: 'alice@example.com' });new Model() ile Belge Oluşturma
Model oluşturucusunu kullanarak yeni bir belge örneği oluşturun: new User({ name: '...', ... }). Bu işlem, doğrulama özelliklerine sahip ancak veritabanına kaydedilmeyen, bellekte tutulan bir belge nesnesi oluşturur. Belgeyi kalıcı hâle getirmek için örnek üzerinde .save() çağırın veya her iki adımı birleştiren statik User.create() kısa gösterimini kullanın. Mongoose, kaydetmeden önce belgeyi şemaya göre doğrular ve kısıtlamalar ihlal edilirse ValidationError oluşturur.
// Method 1: new + save (two-step)
const user = new User({
name: 'Alice',
email: 'alice@example.com',
role: 'admin'
});
await user.save(); // validates then saves to 'users' collection
// Method 2: User.create() shorthand
const user2 = await User.create({
name: 'Bob',
email: 'bob@example.com'
});
console.log('Created user ID:', user2._id);
// Method 3: insertMany for bulk
await User.insertMany([
{ name: 'Carol', email: 'carol@example.com' },
{ name: 'Dave', email: 'dave@example.com' }
]);Sanal Özellikler
Sanal özellikler, veritabanında saklanmayan ancak belgedeki diğer alanlardan hesaplanan özelliklerdir. Uygulama kodunuzda normal belge alanları gibi davranırlar, ancak hiçbir zaman MongoDB'ye yazılmazlar. Yaygın kullanım alanları arasında firstName ve lastName alanlarını fullName sanal özelliğinde birleştirmek, bir birthDate alanından age hesaplamak veya bir _id değerinden herkese açık bir url oluşturmak bulunur.
const personSchema = new mongoose.Schema({
firstName: String,
lastName: String,
birthDate: Date
});
// Virtual: combines firstName and lastName
personSchema.virtual('fullName').get(function () {
return this.firstName + ' ' + this.lastName;
// Use regular function (not arrow function) to access 'this'
});
// Virtual with a setter for convenience
personSchema.virtual('fullName').get(function () {
return this.firstName + ' ' + this.lastName;
}).set(function (v) {
this.firstName = v.split(' ')[0];
this.lastName = v.split(' ')[1];
});
const Person = mongoose.model('Person', personSchema);
const p = new Person({ firstName: 'Alice', lastName: 'Smith' });
console.log(p.fullName); // 'Alice Smith'Sanal Özellikleri JSON Çıktısına Dahil Etme
Varsayılan olarak, bir belge JSON'a dönüştürülürken sanal özellikler dahil edilmez (örneğin, bir API yanıtında gönderilirken). Bunları dahil etmek için şema seçeneklerinde { toJSON: { virtuals: true } } ayarını yapın veya açıkça doc.toJSON({ virtuals: true }) çağrısı yapın. Express uygulamalarında res.json(doc), toJSON() işlevini otomatik olarak çağırır. Bu nedenle, sanal özellikleri her zaman dahil etmenin en temiz yolu şemada toJSON: { virtuals: true } ayarını yapmaktır.
const userSchema = new mongoose.Schema(
{
firstName: String,
lastName: String
},
{
toJSON: { virtuals: true }, // include virtuals in res.json()
toObject: { virtuals: true } // include virtuals in .toObject()
}
);
userSchema.virtual('fullName').get(function () {
return this.firstName + ' ' + this.lastName;
});
const user = new User({ firstName: 'Alice', lastName: 'Smith' });
console.log(JSON.stringify(user)); // includes 'fullName': 'Alice Smith'Şemalarda Özel Doğrulama
Mongoose, her alan için özel doğrulayıcı işlevlerini destekler. Doğrulayıcı işlevi alan değerini alır ve değer geçerliyse true, geçersizse false döndürmelidir (veya bir hata oluşturmalıdır). Ayrıca özel bir hata iletisi de sağlayabilirsiniz. Özel doğrulayıcılar .save() işleminden önce çalışır ve zaman uyumsuz olabilir. Bu özellik, benzersiz dizinin ötesinde veritabanı düzeyinde benzersizlik denetimleri yapmak için kullanışlıdır.
const productSchema = new mongoose.Schema({
name: String,
price: {
type: Number,
required: true,
validate: {
validator: function (v) {
return v > 0; // price must be positive
},
message: props => 'Price must be positive, got ' + props.value
}
},
sku: {
type: String,
validate: {
validator: function (v) {
return /^[A-Z]{2}-\d{4}$/.test(v); // format: AB-1234
},
message: 'SKU must match format AB-1234'
}
}
});Şema Yöntemleri ve Statik Yöntemler
Şemalar, örnek yöntemlerini (her belgede kullanılabilir) ve statik yöntemleri (Model sınıfı üzerinde çağrılır) destekler. Örnek yöntemleri, belirli belgeye erişmek için this kullanır; bu nedenle parola karşılaştırma veya çıktıyı biçimlendirme gibi belgeye özgü işlemler için idealdir. Statik yöntemler, belirli bir örnek üzerinde çalışmayan yaygın sorgular veya fabrika işlevleri için kullanışlıdır.
const userSchema = new mongoose.Schema({ email: String, passwordHash: String });
// Instance method: available on each user document
userSchema.methods.checkPassword = function (candidatePassword) {
return bcrypt.compare(candidatePassword, this.passwordHash);
};
// Static method: called on the User model
userSchema.statics.findByEmail = function (email) {
return this.findOne({ email: email.toLowerCase() });
};
const User = mongoose.model('User', userSchema);
// Usage:
const user = await User.findByEmail('alice@example.com'); // static
const valid = await user.checkPassword('secret'); // instance methodAlt Belgeler ve İç İçe Şema Nesneleri
Mongoose, gömülü alt belgeler (şema dizileri olarak tanımlanır) ile iç içe şema nesneleri (bir alanın içinde yer alan düz şema tanımı) arasında ayrım yapar. Dizi alt belgelerinin her biri kendi _id değerine sahip olur ve doc.items.id(subId) aracılığıyla ayrı belgeler gibi işlenebilir. İç içe nesneler, üst belgenin yaşam döngüsünü paylaşır. Sıralı kayıt koleksiyonları (sipariş satırları, yorumlar) için dizi alt belgelerini kullanın. Bire bir gömülü yapılar (adres, üst veriler) için iç içe nesneleri kullanın.
// Nested object — no array, no _id per entry
const userSchema = new Schema({
address: {
street: String,
city: String,
zip: String
}
});
// Array subdocuments — each item gets its own _id
const orderSchema = new Schema({
items: [
{
productId: Schema.Types.ObjectId,
quantity: Number,
price: Number
// _id auto-added to each item
}
]
});
// Access subdocument by ID:
const item = order.items.id(someItemId);Kısa Kontrol
Bu derste ele alınan MongoDB ve NoSQL Veritabanları kavramlarını anlayıp anlamadığınızı sınayın.
Ders Özeti
Bu derste şunları öğrendiniz: Mongoose şemaları belge yapısını, türleri ve doğrulama kurallarını tanımlar; modeller şemalardan derlenir ve sorgu/yazma arayüzü sağlar (Model.find(), new Model() vb.); ayrıca sanal özellikler bellekte bulunur ancak MongoDB'de hiçbir zaman saklanmaz ve fullName veya url gibi türetilmiş alanlar için kullanışlıdır. Sırada, zincirleme kullanımı, .lean() ve yerel sürücüyle karşılaştırmayı içeren Mongoose sorgu API'sini inceleyeceğiz.
Yapay zeka eğitmeniyle JavaScript öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 30
- Dersler
- 120
Sıkça Sorulan Sorular
“Mongoose Şemaları, Modelleri ve Sanal Özellikleri” dersi ücretsiz mi?
Evet — “Mongoose Şemaları, Modelleri ve Sanal Özellikleri” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve MongoDB Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. MongoDB Academy kursu toplamda 4 dersten oluşur.
“Mongoose Şemaları, Modelleri ve Sanal Özellikleri” dersinde ne öğreneceğim?
Öğrenenler, tür, doğrulama ve varsayılan seçeneklerle Mongoose şemaları tanımlayacak, modeller oluşturacak ve sanal özellikler ekleyeceklerdir. MongoDB Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
MongoDB Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te MongoDB Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Mongoose Şemaları, Modelleri ve Sanal Özellikleri” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu MongoDB Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her MongoDB Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Resmî Node.js Sürücüsüyle Bağlanma
- Mongoose Şemaları, Modelleri ve Sanal Özellikleri
- Mongoose Sorguları, Zincirleme ve Lean Belgeler
- Mongoose Ara Katmanı: Önce ve Sonra Kancaları