MongoDB Academy · Ders

Dahil Etme ve Hariç Tutma Projeksiyonları

Öğrenenler, sorgu sonuçlarındaki belirli alanları seçecek veya gizleyecek ve tek bir projeksiyonda dahil etme ile hariç tutmayı neden birlikte kullanamayacağınızı anlayacaktır.

1. ders / 413 adım

Dahil Etme ve Hariç Tutma Projeksiyonları, CoddyKit'te ücretsiz bir MongoDB Academy dersidir. Bu, 4 dersinin 1. 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.

Yansıtma Nedir?

Yansıtma, MongoDB'ye sonuçta hangi alanların dahil edileceğini veya hariç tutulacağını bildiren find() ya da findOne() işlevlerinin ikinci bağımsız değişkenidir. Belgenin tamamını döndürmek yerine, tam olarak ihtiyaç duyduğunuz alanları belirtirsiniz. Bu, bant genişliği kullanımını ve uygulamanızdaki bellek tüketimini azaltır, ayrıca API yanıtlarını daha yalın tutar. Yansıtma, kullanılabilen en basit ve en etkili sorgu optimizasyonlarından biridir.

Dahil Etme Modu: Döndürülecekleri Belirtme

Dahil etme modunda, almak istediğiniz alanları listeler ve değerlerini 1 olarak ayarlarsınız. MongoDB yalnızca bu alanları ve varsayılan olarak dahil edilen _id alanını döndürür. Bu, sorgunuzun bağlı olduğu alanları açıkça belirttiği ve kodu okuyan herkes için amacı anlaşılır kıldığı için en yaygın yansıtma biçimidir.

// Return only name and email — everything else is excluded
const user = await db.collection('users').findOne(
  { email: 'alice@example.com' },
  { projection: { name: 1, email: 1 } }
);
// Result: { _id: ObjectId('...'), name: 'Alice', email: 'alice@example.com' }

Sonuçlardan _id Alanını Hariç Tutma

_id alanını açıkça hariç tutmadığınız sürece, dahil etme yansıtmalarında her zaman yer alır. Bu alanı gizlemek için dahil edilen alanların yanına _id: 0 ekleyin. Bu yaklaşım, farklı bir tanımlayıcı alan kullanan API yanıtları oluştururken veya dahili MongoDB kimliklerinin istemcilere sızmasını önlemek istediğinizde kullanışlıdır.

// Include name and email but suppress _id
const user = await db.collection('users').findOne(
  { email: 'alice@example.com' },
  { projection: { _id: 0, name: 1, email: 1 } }
);
// Result: { name: 'Alice', email: 'alice@example.com' }
// _id is not present

Dışlama Modu: Hariç Tutulacakları Belirtme

Dışlama modunda, alanları sonuçtan kaldırmak için değerlerini 0 olarak ayarlarsınız. Diğer tüm alanlar döndürülür. Bu yöntem, neredeyse tüm alanları almak ancak birkaç hassas veya büyük alanı gizlemek istediğinizde kullanışlıdır; örneğin genel amaçlı bir kullanıcı sorgusunun sonuçlarında passwordHash alanını gizleyebilirsiniz.

// Return all user fields EXCEPT passwordHash and internalNotes
const user = await db.collection('users').findOne(
  { email: 'alice@example.com' },
  { projection: { passwordHash: 0, internalNotes: 0 } }
);
// Result: everything except passwordHash and internalNotes

Dahil Etme ve Dışlamayı Birlikte Kullanamazsınız

MongoDB, tek bir yansıtmada dahil etme (1) ve dışlama (0) alanlarının birlikte kullanılmasına _id alanı dışında izin vermez. Bunu yapmaya çalışırsanız Projection cannot have a mix of inclusion and exclusion fields hatası oluşur. Her sorgu için tek bir mod seçin. İzin verilen tek birleşim, dahil etme alanları (1) ile birlikte _id: 0 kullanılmasıdır.

// VALID: inclusion mode with _id suppressed
{ projection: { name: 1, email: 1, _id: 0 } }

// VALID: exclusion mode
{ projection: { passwordHash: 0, secret: 0 } }

// INVALID: mixing 1 and 0 (throws an error)
// { projection: { name: 1, passwordHash: 0 } }  <- ERROR

find() ve Toplama İşleminde Yansıtmalar

find() içinde yansıtma ikinci bağımsız değişkendir. Toplama işlem hattında ise aynı dahil etme/dışlama söz dizimini ve ayrıca hesaplanan alanları ve ifadeleri destekleyen $project aşamasını kullanırsınız. Her ikisi de birlikte kullanamama kuralı açısından aynı şekilde çalışır; ancak $project alanları yeniden adlandırabildiği ve hesaplanan değerler ekleyebildiği için daha güçlüdür.

// find() projection
db.users.find({}, { name: 1, email: 1, _id: 0 });

// Equivalent in aggregation with $project
db.users.aggregate([
  { $project: { name: 1, email: 1, _id: 0 } }
]);

Yansıtmalar ve Kapsanan Sorgular

Kapsanan sorgu, hem filtre alanlarının hem de yansıtma alanlarının tamamen tek bir dizin içinde bulunduğu sorgudur. MongoDB, gerçek belgeyi diskten okumadan kapsanan bir sorguyu yalnızca dizinden yanıtlayabilir. Yansıtmalar, kapsanan sorgular için zorunludur: dizinde bulunmayan bir alanı yansıtırsanız MongoDB belgeyi almak zorunda kalır ve kapsama avantajı ortadan kalkar.

// Index on { email: 1, name: 1 }
db.users.createIndex({ email: 1, name: 1 });

// Covered query — filter + projection both satisfied by the index
db.users.find(
  { email: 'alice@example.com' },
  { name: 1, email: 1, _id: 0 }  // _id must be excluded for full coverage
).explain('executionStats');
// Look for 'totalDocsExamined: 0' in the output

Mongoose ile Yansıtmalar

Mongoose'da .select() işlevine bir yansıtma dizesi veya nesnesi aktarabilirsiniz. Dahil etme için +, dışlama için - kullanılan ve alanların boşluklarla ayrıldığı dize biçimi yaygındır. Şemada select: false ile işaretlenen alanlar (örneğin passwordHash) varsayılan olarak sonuçlardan hariç tutulur ve +passwordHash ile açıkça dahil edilmelidir.

// Mongoose: string projection (+ include, - exclude)
const users = await User.find({}).select('name email -_id');

// Object projection
const user = await User.findOne({ email: 'a@b.com' }).select({ name: 1, email: 1, _id: 0 });

// Schema-level default exclusion
const userSchema = new mongoose.Schema({
  email: String,
  passwordHash: { type: String, select: false }  // excluded by default
});

Yansıtmanın Performans Faydaları

Yansıtmalar performansı üç şekilde artırır: (1) yansıtma bir dizinle uyumlu olduğunda diskten okunan veri miktarını azaltır; (2) MongoDB sunucusu ile uygulamanız arasındaki ağ bant genişliği kullanımını azaltır; (3) uygulamanızın sorgu sonuçlarını tutmak için ayırması gereken bellek miktarını azaltır. Büyük belgelerde veya yüksek aktarım hacmine sahip API'lerde yansıtmalar yanıt boyutunu %80 veya daha fazla küçültebilir.

Toplama İşleminde Hesaplanan Değerleri Yansıtma

Toplama işlemindeki $project aşaması basit dahil etme/dışlama işlemlerinin ötesine geçer. İfadeleri kullanarak yeni alanlar hesaplayabilirsiniz; örneğin dizeleri birleştirebilir, aritmetik işlemler yapabilir veya bir tarihin bölümlerini çıkarabilirsiniz. Böylece sonuçları uygulamaya göndermeden önce belgelerin biçimini sunucu tarafında dönüştürebilir ve istemci tarafındaki işlemeyi azaltabilirsiniz.

db.orders.aggregate([
  {
    $project: {
      orderId: '$_id',
      _id: 0,
      totalWithTax: { $multiply: ['$subtotal', 1.1] },  // computed field
      year: { $year: '$createdAt' }                       // date extraction
    }
  }
]);

Hassas Alanları Her Zaman Yansıtma Dışında Tutun

Genel amaçlı sorgularda passwordHash, apiKey, ssn veya creditCardNumber gibi hassas alanları asla döndürmeyin. Bu alanların API yanıtlarında yanlışlıkla görünmesini önlemek için dışlama yansıtmaları veya şema düzeyinde select: false kullanın. Derinlemesine savunma yaklaşımı, uygulama bu alanları yanıtlardan zaten kaldırsa bile, ek güvence olarak veri katmanında yansıtma uygulamak anlamına gelir.

Hızlı Kontrol

Bu derste ele alınan MongoDB ve NoSQL Veritabanları kavramlarını anlayıp anlamadığınızı test edin.

Ders Özeti

Bu derste şunları öğrendiniz: dahil etme yansıtmaları (değer 1) yalnızca listelenen alanları döndürür, dışlama yansıtmaları (değer 0) listelenenler dışındaki tüm alanları döndürür ve _id: 0 ile dahil etme alanları dışında, dahil etme ve dışlama birlikte kullanılamaz. Sırada, nokta gösterimini ve $slice'ı kullanarak iç içe alanları ve dizileri yansıtmayı inceleyeceğiz.

Başlamak ücretsiz

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

“Dahil Etme ve Hariç Tutma Projeksiyonları” dersi ücretsiz mi?

Evet — “Dahil Etme ve Hariç Tutma Projeksiyonları” 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.

“Dahil Etme ve Hariç Tutma Projeksiyonları” dersinde ne öğreneceğim?

Öğrenenler, sorgu sonuçlarındaki belirli alanları seçecek veya gizleyecek ve tek bir projeksiyonda dahil etme ile hariç tutmayı neden birlikte kullanamayacağınızı anlayacaktır. 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 1. dersidir.

“Dahil Etme ve Hariç Tutma Projeksiyonları” 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

  1. Dahil Etme ve Hariç Tutma Projeksiyonları
  2. İç İçe ve Dizi Alanlarını Projeksiyonla Alma
  3. $ ve $elemMatch Dizi Projeksiyonları
  4. API Yanıtları İçin Projeksiyon En İyi Uygulamaları
← MongoDB Academy Sayfasına Dön