Takip et

MongoDB’de Şema Doğrulama (Schema Validation) Nasıl Kullanılır?

MongoDB’de Şema Doğrulama (Schema Validation) Nasıl Kullanılır? MongoDB, esnek ve şemasız (schema-less) yapısıyla bilinir. Bu özellik, geli

MongoDB’de Şema Doğrulama (Schema Validation) Nasıl Kullanılır?

MongoDB, esnek ve şemasız (schema-less) yapısıyla bilinir. Bu özellik, geliştiricilere veri modellerini hızla değiştirebilme ve farklı veri yapılarını tek bir koleksiyonda barındırabilme özgürlüğü sunar. Ancak, bu esneklik beraberinde bazı zorlukları da getirebilir. Özellikle büyük ölçekli uygulamalarda veya birden fazla geliştiricinin çalıştığı projelerde veri tutarlılığı, kalitesi ve öngörülebilirliği önemli hale gelir. İşte bu noktada MongoDB’nin şema doğrulama (schema validation) özelliği devreye girer. Bu makale, MongoDB’de şema doğrulamanın ne olduğunu, neden önemli olduğunu ve nasıl etkili bir şekilde kullanılacağını ayrıntılı olarak ele alacaktır.

MongoDB’nin Esnek Şema Yapısı ve Doğrulama İhtiyacı

MongoDB, belgeleri JSON benzeri BSON formatında saklayan bir belge tabanlı (document-oriented) veritabanıdır. Geleneksel ilişkisel veritabanlarının aksine, MongoDB’de bir koleksiyondaki belgelerin belirli bir şemaya uyması zorunluluğu yoktur. Bu “şemasız” yaklaşım, aşağıdaki avantajları sunar:

* Hızlı Geliştirme: Veritabanı şemasını önceden tasarlama ve sabitleme ihtiyacı ortadan kalktığı için uygulama geliştirme süreci hızlanır.
* Esneklik: Uygulama gereksinimleri değiştikçe veri modeli kolayca adapte edilebilir. Yeni alanlar eklemek veya mevcut alanları değiştirmek çok daha basittir.
* Çeşitli Veri Tipleri: Aynı koleksiyonda farklı veri yapılarına sahip belgeler saklanabilir, bu da polimorfik verilere uyum sağlar.

Ancak, bu esnekliğin potansiyel dezavantajları da vardır:

* Veri Tutarsızlığı: Farklı belgelerin aynı alana farklı veri tipleriyle sahip olması veya bazı belgelerde zorunlu olması gereken alanların eksik olması veri tutarsızlığına yol açabilir.
* Uygulama Hataları: Uygulama kodu, belirli bir alanın varlığını veya belirli bir veri tipine sahip olmasını beklerken, veritabanındaki tutarsızlıklar çalışma zamanı hatalarına neden olabilir.
* Sorgulama Zorlukları: Tutarsız veri yapıları, sorguları ve veri analizini zorlaştırabilir, çünkü tüm belgelerin belirli bir yapıya sahip olduğu varsayılamaz.
* Bakım Zorluğu: Zamanla, veri yapısının net olmaması, veritabanı yönetimini ve uygulamanın bakımını karmaşık hale getirebilir.

İşte bu dezavantajları gidermek ve MongoDB’nin esnekliğini korurken veri kalitesini artırmak için şema doğrulama özelliği geliştirilmiştir. Şema doğrulama, belirli kurallar tanımlayarak bir koleksiyona eklenecek veya güncellenecek belgelerin bu kurallara uymasını sağlar. Bu sayede, uygulamanızın beklediği veri yapısının veritabanı seviyesinde korunmasına yardımcı olur.

Şema Doğrulamanın Temelleri

MongoDB’de şema doğrulama, koleksiyon seviyesinde tanımlanır ve JSON Şema (JSON Schema) standartına benzer bir sözdizimi kullanır. Doğrulama kuralları, bir koleksiyona yeni belgeler eklenirken (insert) veya mevcut belgeler güncellenirken (update) uygulanır.

Bir koleksiyona şema doğrulama kuralları eklemek için iki ana yöntem vardır:

1. Yeni Bir Koleksiyon Oluştururken: db.createCollection() metodu kullanılırken validator seçeneği belirtilebilir.
2. Mevcut Bir Koleksiyonu Güncellerken: db.runCommand() ile collMod komutu kullanılarak mevcut bir koleksiyona şema eklenebilir veya mevcut şema güncellenebilir.

Doğrulama kuralları, bir JSON nesnesi olarak validator alanında tanımlanır. Bu nesne, belgenin yapısını, alanların tiplerini, aralıklarını, zorunluluklarını ve diğer kısıtlamalarını belirten JSON Şema anahtar kelimelerini içerir.

Şema doğrulama ile birlikte iki önemli seçenek daha bulunur:

* validationLevel: Doğrulama kurallarının ne kadar katı uygulanacağını belirler.
* strict (varsayılan): Tüm ekleme ve güncelleme işlemleri için doğrulama kurallarını uygular.
* moderate: Yalnızca mevcut belgeleri güncellerken ve şema tarafından tanımlanmış alanları etkilerken doğrulama yapar. Yeni belgeler için strict gibi davranır. Şema tarafından tanımlanmamış alanları içeren güncellemelerde doğrulama uygulanmaz.
* off: Doğrulamayı devre dışı bırakır.
* validationAction: Doğrulama başarısız olduğunda ne yapılacağını belirler.
* error (varsayılan): Doğrulama başarısız olursa, ekleme veya güncelleme işlemi reddedilir ve bir hata döndürülür.
* warn: Doğrulama başarısız olsa bile ekleme veya güncelleme işlemi başarılı olur, ancak sunucu loglarına bir uyarı mesajı yazılır. Bu, şema doğrulamayı aşamalı olarak uygulamak veya sadece veri kalitesini izlemek istediğiniz durumlarda kullanışlıdır.

Bu seçenekler, geliştiricilere şema doğrulamayı esnek bir şekilde uygulamaları için güçlü araçlar sunar.

JSON Şema ile Doğrulama Kuralları Oluşturma

MongoDB’deki şema doğrulama, JSON Şema taslağının bir alt kümesini ve MongoDB’ye özgü bazı anahtar kelimeleri kullanır. Bir belgenin yapısını ve alanlarının özelliklerini tanımlamak için bu anahtar kelimelerden faydalanılır.

Genel JSON Şema Anahtar Kelimeleri

Bu anahtar kelimeler, alanların tiplerini, değer aralıklarını ve zorunluluklarını belirlemek için kullanılır:

* type: Bir alanın veri tipini belirtir. Geçerli tipler: object, string, number, array, boolean, null. Bir alan birden fazla tipe sahip olabilir (örneğin, ["string", "null"]).
* properties: Bir belgenin veya iç içe geçmiş bir nesnenin alanlarını ve her alan için özel doğrulama kurallarını tanımlar.
* required: Bir dizidir ve belirtilen alanların belgede zorunlu olduğunu gösterir. Örneğin: ["ad", "soyad", "email"].
* additionalProperties: properties içinde belirtilmeyen ek alanlara izin verilip verilmeyeceğini belirler. Varsayılan olarak true‘dur. false olarak ayarlanırsa, yalnızca properties içinde tanımlanan alanlara izin verilir.
* items: Bir dizinin elemanları için doğrulama kuralları tanımlar. Tüm elemanlar aynı şemaya uymalıdır.
* enum: Bir alanın alabileceği belirli değerlerin bir listesini tanımlar. Alanın değeri bu listedeki değerlerden biri olmalıdır.
* minLength, maxLength: string tipli alanlar için minimum ve maksimum karakter uzunluğunu belirler.
* pattern: string tipli alanlar için bir düzenli ifade (regex) belirler. Alanın değeri bu düzenli ifadeye uymalıdır.
* minimum, maximum, exclusiveMinimum, exclusiveMaximum: number tipli alanlar için sayısal değer aralıklarını belirler. exclusive olanlar, sınır değerinin dahil edilmediğini gösterir.
* minItems, maxItems: array tipli alanlar için minimum ve maksimum eleman sayısını belirler.
* uniqueItems: array tipli alanlar için dizideki tüm elemanların benzersiz olması gerektiğini belirtir.
* Mantıksal Kombinasyon Operatörleri (allOf, anyOf, oneOf, not):
* allOf: Belgenin tüm belirtilen şemalara uyması gerektiğini belirtir.
* anyOf: Belgenin en az bir belirtilen şemaya uyması gerektiğini belirtir.
* oneOf: Belgenin tam olarak bir belirtilen şemaya uyması gerektiğini belirtir.
* not: Belgenin belirtilen şemaya uymaması gerektiğini belirtir.

MongoDB’ye Özgü bsonType Anahtar Kelimesi

MongoDB, JSON Şema’nın type anahtar kelimesine ek olarak, kendi BSON tiplerini belirtmek için bsonType anahtar kelimesini sunar. Bu, özellikle ObjectId, Date, Decimal128, Long, BinData, Timestamp, Regex, DBPointer, Undefined, MinKey, MaxKey gibi MongoDB’ye özgü veri tiplerini doğrulamak için çok önemlidir.

Örneğin, bir _id alanının ObjectId tipinde olmasını sağlamak için type: "object" yerine bsonType: "objectId" kullanmak daha doğru ve spesifiktir.

Pratik Uygulamalar ve Örnekler

Şimdi, şema doğrulamanın farklı senaryolarda nasıl kullanılacağına dair pratik örneklere göz atalım.

Yeni Bir Koleksiyon Oluştururken Şema Tanımlama

Bir kullanicilar koleksiyonu oluşturalım ve bu koleksiyondaki her kullanıcının ad, soyad, email, yas ve kayitTarihi gibi belirli alanlara sahip olmasını sağlayalım.

db.createCollection("kullanicilar", {
   validator: {
      $jsonSchema: {
         bsonType: "object",
         required: ["ad", "soyad", "email", "yas", "kayitTarihi"],
         properties: {
            ad: {
               bsonType: "string",
               description: "ad alanı bir string olmalı ve zorunludur"
            },
            soyad: {
               bsonType: "string",
               description: "soyad alanı bir string olmalı ve zorunludur"
            },
            email: {
               bsonType: "string",
               pattern: "^.+@.+\\..+$",
               description: "email alanı geçerli bir email formatında olmalı ve zorunludur"
            },
            yas: {
               bsonType: "int",
               minimum: 18,
               maximum: 120,
               description: "yas alanı bir integer olmalı, 18 ile 120 arasında olmalı ve zorunludur"
            },
            kayitTarihi: {
               bsonType: "date",
               description: "kayitTarihi alanı bir Date olmalı ve zorunludur"
            },
            telefon: {
               bsonType: "string",
               minLength: 10,
               maxLength: 15,
               description: "telefon alanı isteğe bağlı bir string olmalı, 10-15 karakter arasında olmalı"
            },
            aktif: {
               bsonType: "boolean",
               description: "aktif alanı isteğe bağlı bir boolean olmalı",
               default: true // Varsayılan değer, ancak şema doğrulaması bunu zorlamaz, uygulama katmanı için bir nottur.
            },
            roller: {
               bsonType: "array",
               items: {
                  bsonType: "string",
                  enum: ["admin", "editor", "viewer"]
               },
               minItems: 1,
               uniqueItems: true,
               description: "roller alanı bir dizi string olmalı, en az 1 elemanı olmalı, benzersiz ve belirli değerlerden oluşmalı"
            }
         }
      }
   },
   validationLevel: "strict",
   validationAction: "error"
});

Bu örnekte:
* $jsonSchema anahtar kelimesi, doğrulama kurallarının JSON Şema formatında olduğunu belirtir.
* bsonType: "object" belgenin bir nesne olmasını sağlar.
* required dizisi, hangi alanların zorunlu olduğunu belirtir.
* properties nesnesi, her bir alan için ayrı ayrı doğrulama kurallarını içerir. email alanı için bir pattern (düzenli ifade) kullanılarak geçerli bir e-posta formatı zorunlu kılınmıştır. yas için bsonType: "int" ve minimum/maximum değerleri belirlenmiştir. roller alanı için bir dizi (array) tanımlanmış ve elemanlarının enum ile belirli değerlerden biri olması, minItems ile en az bir eleman içermesi ve uniqueItems ile elemanların benzersiz olması sağlanmıştır.

Şimdi bu koleksiyona geçerli ve geçersiz belgeler eklemeyi deneyelim:

// Geçerli belge
db.kullanicilar.insertOne({
   ad: "Ahmet",
   soyad: "Yılmaz",
   email: "ahmet.yilmaz@example.com",
   yas: 30,
   kayitTarihi: new Date(),
   telefon: "5551234567",
   aktif: true,
   roller: ["editor"]
}); // Başarılı olacaktır

// Geçersiz belge - email formatı yanlış
db.kullanicilar.insertOne({
   ad: "Ayşe",
   soyad: "Demir",
   email: "ayse.demir", // Hatalı email
   yas: 25,
   kayitTarihi: new Date(),
   roller: ["viewer"]
});
/*
Hata: "Document failed validation"
*/

// Geçersiz belge - zorunlu alan eksik (yas)
db.kullanicilar.insertOne({
   ad: "Mehmet",
   soyad: "Can",
   email: "mehmet.can@example.com",
   kayitTarihi: new Date(),
   roller: ["admin"]
});
/*
Hata: "Document failed validation"
*/

// Geçersiz belge - yas aralık dışında
db.kullanicilar.insertOne({
   ad: "Zeynep",
   soyad: "Kaya",
   email: "zeynep.kaya@example.com",
   yas: 15, // 18'den küçük
   kayitTarihi: new Date(),
   roller: ["viewer"]
});
/*
Hata: "Document failed validation"
*/

// Geçersiz belge - roller dizisinde tekrarlayan eleman
db.kullanicilar.insertOne({
   ad: "Can",
   soyad: "Kurt",
   email: "can.kurt@example.com",
   yas: 40,
   kayitTarihi: new Date(),
   roller: ["admin", "admin"] // uniqueItems kuralını ihlal ediyor
});
/*
Hata: "Document failed validation"
*/

Mevcut Bir Koleksiyona Şema Ekleme veya Güncelleme

Diyelim ki urunler adında mevcut bir koleksiyonunuz var ve şimdi bu koleksiyona şema doğrulama eklemek istiyorsunuz. Veya mevcut bir şemayı güncellemek istiyorsunuz. Bunun için db.runCommand({ collMod: ... }) komutunu kullanırız.

// Mevcut bir 'urunler' koleksiyonuna şema ekleme
db.runCommand({
   collMod: "urunler",
   validator: {
      $jsonSchema: {
         bsonType: "object",
         required: ["urunAdi", "fiyat", "stokAdedi", "kategori"],
         properties: {
            urunAdi: {
               bsonType: "string",
               description: "Ürün adı bir string olmalı ve zorunludur"
            },
            fiyat: {
               bsonType: ["double", "decimal"], // double veya decimal olabilir
               minimum: 0,
               description: "Fiyat sıfırdan büyük veya eşit bir sayı olmalı ve zorunludur"
            },
            stokAdedi: {
               bsonType: "int",
               minimum: 0,
               description: "Stok adedi sıfırdan büyük veya eşit bir tamsayı olmalı ve zorunludur"
            },
            kategori: {
               bsonType: "string",
               enum: ["Elektronik", "Giyim", "Ev Aletleri", "Kitap"],
               description: "Kategori belirli değerlerden biri olmalı ve zorunludur"
            },
            aciklama: {
               bsonType: "string",
               description: "Açıklama alanı isteğe bağlı bir stringdir"
            }
         }
      }
   },
   validationLevel: "strict",
   validationAction: "error"
});

Bu komut, urunler koleksiyonuna belirtilen doğrulama kurallarını uygular. Eğer koleksiyon zaten varsa, şema güncellenir. Eğer yoksa, bu komut hata verecektir, çünkü collMod mevcut bir koleksiyon üzerinde çalışır.

Doğrulama Seviyeleri (validationLevel) ve Eylemleri (validationAction)

validationLevel ve validationAction seçenekleri, şema doğrulamanın davranışını ince ayarlamanıza olanak tanır.

* validationLevel: "moderate" Kullanımı:
Diyelim ki urunler koleksiyonunuzda zaten şemaya uymayan eski belgeler var ve siz bu belgeleri etkilemeden yeni eklenen veya güncellenen alanları doğrulamak istiyorsunuz. moderate seviyesi bu durumda faydalıdır.

db.runCommand({
       collMod: "urunler",
       validationLevel: "moderate", // Yalnızca şema tarafından belirtilen alanları etkileyen güncellemelerde doğrulama yapar
       validationAction: "error"
    });

    // Eski bir belge (örneğin, kategori alanı yok)
    db.urunler.insertOne({
       urunAdi: "Eski Ürün",
       fiyat: 99.99,
       stokAdedi: 10
    }); // Bu belge, 'moderate' seviyesinde yeni ekleme olduğu için hala hata verir (çünkü 'kategori' zorunlu).
        // Eğer 'validationLevel' 'moderate' iken, mevcut bir belgedeki 'kategori' alanı güncellenirse, doğrulama çalışır.
        // Ama bir belgedeki 'açıklama' alanı güncellenirse (ki bu şemada isteğe bağlıdır), doğrulama çalışmaz.

    // 'moderate' seviyesinde bir senaryo:
    // Diyelim ki mevcut bir belgede 'urunAdi' alanı var ama 'fiyat' yoktu.
    // Şema, 'fiyat'ı zorunlu kılıyor. Eğer bu belgeyi güncellerken 'fiyat' eklemezsek, 'moderate' seviyesi hata verir.
    // Ancak, şemada tanımlanmayan bir alan eklersek, 'moderate' seviyesi buna izin verir (eğer additionalProperties true ise).

* validationAction: "warn" Kullanımı:
Şema doğrulamayı test ederken veya veri kalitesini sadece izlemek istediğinizde warn seçeneği kullanışlıdır. Doğrulama başarısız olsa bile işlem devam eder, ancak bir uyarı logu oluşturulur.

db.runCommand({
       collMod: "kullanicilar",
       validationLevel: "strict",
       validationAction: "warn" // Doğrulama başarısız olursa sadece uyarı verilir
    });

    // Geçersiz belge - email formatı yanlış (şimdi sadece uyarı verir, belge eklenir)
    db.kullanicilar.insertOne({
       ad: "Deneme",
       soyad: "Kullanıcı",
       email: "gecersiz-email",
       yas: 20,
       kayitTarihi: new Date(),
       roller: ["viewer"]
    });
    // Bu işlem başarılı olur, ancak MongoDB loglarında bir uyarı mesajı görürsünüz.

Karmaşık Şema Kuralları ve Mantıksal Operatörler

Bazen bir belgenin yapısı, başka bir alanın değerine bağlı olarak değişebilir. Bu tür karmaşık kuralları allOf, anyOf, oneOf, not gibi mantıksal operatörlerle tanımlayabiliriz.

Örneğin, bir siparisler koleksiyonunda, odemeTipi alanına göre farklı alanların zorunlu olmasını isteyelim:
* Eğer odemeTipi “Kredi Kartı” ise, kartNumarasi ve sonKullanmaTarihi zorunlu olmalı.
* Eğer odemeTipi “Banka Havalesi” ise, bankaAdi ve iban zorunlu olmalı.

db.createCollection("siparisler", {
   validator: {
      $jsonSchema: {
         bsonType: "object",
         required: ["siparisNo", "toplamTutar", "odemeTipi"],
         properties: {
            siparisNo: {
               bsonType: "string",
               description: "Sipariş numarası zorunlu bir stringdir"
            },
            toplamTutar: {
               bsonType: ["double", "decimal"],
               minimum: 0.01,
               description: "Toplam tutar sıfırdan büyük bir sayı olmalı"
            },
            odemeTipi: {
               bsonType: "string",
               enum: ["Kredi Kartı", "Banka Havalesi", "Kapıda Ödeme"],
               description: "Ödeme tipi belirli değerlerden biri olmalı"
            }
         },
         // 'odemeTipi' alanına göre farklı şemalar uygulayalım
         oneOf: [
            { // Kredi Kartı ödemeleri için
               properties: {
                  odemeTipi: { enum: ["Kredi Kartı"] },
                  kartNumarasi: {
                     bsonType: "string",
                     pattern: "^[0-9]{16}$",
                     description: "Kredi kartı numarası 16 haneli bir sayı olmalı"
                  },
                  sonKullanmaTarihi: {
                     bsonType: "string",
                     pattern: "^(0[1-9]|1[0-2])\\/[0-9]{2}$", // MM/YY formatı
                     description: "Son kullanma tarihi MM/YY formatında olmalı"
                  }
               },
               required: ["kartNumarasi", "sonKullanmaTarihi"]
            },
            { // Banka Havalesi ödemeleri için
               properties: {
                  odemeTipi: { enum: ["Banka Havalesi"] },
                  bankaAdi: {
                     bsonType: "string",
                     description: "Banka adı zorunlu bir stringdir"
                  },
                  iban: {
                     bsonType: "string",
                     pattern: "^TR[0-9]{24}$", // Türkiye IBAN formatı için örnek
                     description: "IBAN zorunlu bir stringdir"
                  }
               },
               required: ["bankaAdi", "iban"]
            },
            { // Kapıda Ödeme için (ekstra alan yok)
               properties: {
                  odemeTipi: { enum: ["Kapıda Ödeme"] }
               }
            }
         ]
      }
   }
});

// Geçerli Kredi Kartı siparişi
db.siparisler.insertOne({
   siparisNo: "S-001",
   toplamTutar: 150.75,
   odemeTipi: "Kredi Kartı",
   kartNumarasi: "1234567890123456",
   sonKullanmaTarihi: "12/25"
}); // Başarılı

// Geçersiz Kredi Kartı siparişi (kartNumarasi eksik)
db.siparisler.insertOne({
   siparisNo: "S-002",
   toplamTutar: 200.00,
   odemeTipi: "Kredi Kartı",
   sonKullanmaTarihi: "10/24"
}); // Hata: 'kartNumarasi' zorunlu

// Geçerli Banka Havalesi siparişi
db.siparisler.insertOne({
   siparisNo: "S-003",
   toplamTutar: 500.00,
   odemeTipi: "Banka Havalesi",
   bankaAdi: "Garanti BBVA",
   iban: "TR123456789012345678901234"
}); // Başarılı

// Geçersiz Banka Havalesi siparişi (iban formatı yanlış)
db.siparisler.insertOne({
   siparisNo: "S-004",
   toplamTutar: 300.00,
   odemeTipi: "Banka Havalesi",
   bankaAdi: "İş Bankası",
   iban: "TR123" // Hatalı IBAN
}); // Hata: 'iban' pattern ihlali

Bu örnek, oneOf operatörünün gücünü gösterir. Belge, oneOf içindeki şemalardan yalnızca birine uymalıdır.

bsonType Kullanımı

MongoDB’ye özgü tiplerin doğrulanması için bsonType anahtar kelimesi hayati öneme sahiptir.

db.createCollection("finansalIslemler", {
   validator: {
      $jsonSchema: {
         bsonType: "object",
         required: ["_id", "tutar", "islemTarihi", "islemTipi"],
         properties: {
            _id: {
               bsonType: "objectId",
               description: "Belge ID'si bir ObjectId olmalı"
            },
            tutar: {
               bsonType: "decimal", // Ondalıklı sayılar için Decimal128 kullanıyoruz
               minimum: 0.01,
               description: "Tutar bir decimal olmalı ve 0.01'den büyük olmalı"
            },
            islemTarihi: {
               bsonType: "date",
               description: "İşlem tarihi bir Date nesnesi olmalı"
            },
            islemTipi: {
               bsonType: "string",
               enum: ["Gelir", "Gider", "Transfer"],
               description: "İşlem tipi belirli değerlerden biri olmalı"
            },
            detaylar: {
               bsonType: "string",
               description: "İşlem detayları isteğe bağlı bir string olabilir"
            }
         }
      }
   }
});

// Geçerli işlem
db.finansalIslemler.insertOne({
   _id: new ObjectId(),
   tutar: NumberDecimal("123.45"), // Decimal128 kullanımı
   islemTarihi: new Date(),
   islemTipi: "Gelir"
}); // Başarılı

// Geçersiz işlem - tutar yanlış tipte (double yerine decimal bekleniyor)
db.finansalIslemler.insertOne({
   _id: new ObjectId(),
   tutar: 123.45, // Bu bir double'dır, Decimal128 değil
   islemTarihi: new Date(),
   islemTipi: "Gider"
});
/*
Hata: "Document failed validation"
*/

// Geçersiz işlem - _id yanlış tipte (string yerine objectId bekleniyor)
db.finansalIslemler.insertOne({
   _id: "some_string_id",
   tutar: NumberDecimal("50.00"),
   islemTarihi: new Date(),
   islemTipi: "Transfer"
});
/*
Hata: "Document failed validation"
*/

Bu örnekte NumberDecimal() ile Decimal128 tipinde bir değer oluşturulduğunu ve ObjectId() ile bir ObjectId oluşturulduğunu görebilirsiniz. Bu, MongoDB’ye özgü veri tiplerini doğru bir şekilde kullanmak için önemlidir.

Şema Doğrulama Yönetimi ve İzleme

Şema doğrulama kurallarını tanımlamak kadar, bunları yönetmek ve izlemek de önemlidir.

Mevcut Şemayı Görüntüleme

Bir koleksiyonun mevcut doğrulama kurallarını görmek için db.getCollectionInfos() veya db.getCollection("koleksiyonAdi").validator kullanabilirsiniz:

// Tüm koleksiyonların bilgilerini ve varsa validator'larını gösterir
db.getCollectionInfos({ name: "kullanicilar" });

// Sadece belirli bir koleksiyonun validator'ını gösterir
db.getCollection("kullanicilar").getValidator();

Şemayı Devre Dışı Bırakma veya Kaldırma

Geçici olarak doğrulamayı devre dışı bırakmak veya tamamen kaldırmak isteyebilirsiniz:

* Doğrulamayı Devre Dışı Bırakma:

db.runCommand({
       collMod: "kullanicilar",
       validationLevel: "off"
    });

* Şemayı Tamamen Kaldırma:

db.runCommand({
       collMod: "kullanicilar",
       validator: {}, // Boş bir validator nesnesi ile şema kaldırılır
       validationLevel: "off" // Doğrulamayı da kapatmak iyi bir pratiktir
    });

validator: {} kullanmak, koleksiyon üzerindeki tüm doğrulama kurallarını kaldırır.

Doğrulama Hatalarını Yakalama

Uygulama katmanında, MongoDB’den gelen doğrulama hatalarını yakalamak ve kullanıcıya anlamlı geri bildirimler sunmak önemlidir. MongoDB, doğrulama hatası durumunda bir WriteError veya BulkWriteError döndürür.

try {
   db.kullanicilar.insertOne({
      ad: "Hatalı",
      soyad: "Giriş",
      email: "gecersiz", // Hatalı email
      yas: 10, // Hatalı yaş
      kayitTarihi: new Date(),
      roller: ["misafir"]
   });
} catch (e) {
   if (e.code === 121) { // 121 kodu doğrulama hatasını temsil eder
      print("Doğrulama hatası oluştu: " + e.message);
      // Hata mesajını ayrıştırarak daha spesifik bilgi verebilirsiniz
   } else {
      print("Beklenmedik bir hata oluştu: " + e.message);
   }
}

Uygulama tarafında bu hataları yakalayarak, kullanıcıya hangi alanların yanlış olduğunu veya hangi kuralların ihlal edildiğini belirten özel mesajlar gösterebilirsiniz.

Şema Doğrulamanın Sınırlamaları ve Dikkat Edilmesi Gerekenler

Şema doğrulama güçlü bir araç olsa da, bazı sınırlamaları ve dikkat edilmesi gereken noktaları vardır:

* Performans Etkisi: Her ekleme ve güncelleme işleminde doğrulama kuralları çalıştırıldığı için küçük bir performans maliyeti olabilir. Ancak modern sunucularda ve iyi tasarlanmış şemalarda bu etki genellikle ihmal edilebilir düzeydedir.
* Mevcut Veriler Üzerindeki Etki: Şema doğrulama, yalnızca yeni eklenen veya güncellenen belgeler üzerinde etkilidir. Koleksiyonunuzda zaten şemaya uymayan mevcut belgeler varsa, bu belgeler doğrulama kurallarından etkilenmez ve olduğu gibi kalır. Bu tür verileri temizlemek veya düzeltmek için ayrı bir işlem (örneğin, toplu güncelleme) yapmanız gerekebilir.
* Şema Evrimi: Uygulama gereksinimleri geliştikçe, şema doğrulama kurallarınızın da güncellenmesi gerekebilir. Mevcut bir koleksiyonun şemasını değiştirmek için collMod komutunu kullanırken dikkatli olun. Büyük değişiklikler yapmadan önce test ortamında denemeler yapmak önemlidir.
* İndeksleme ile Karıştırmayın: Şema doğrulama, veri kalitesini ve tutarlılığını sağlamaya odaklanır. Veritabanı performansını artırmak için indeksleme ve sorgu optimizasyonu gibi diğer teknikleri kullanmaya devam etmelisiniz. Şema doğrulama, indekslerin yerini tutmaz.
* Karmaşıklık: Çok karmaşık ve iç içe geçmiş şemalar, yönetimi ve hata ayıklamayı zorlaştırabilir. Şemalarınızı mümkün olduğunca basit ve okunabilir tutmaya çalışın.

Sonuç

MongoDB’nin esnek şema yapısı, geliştiricilere büyük bir özgürlük sunarken, şema doğrulama özelliği bu esnekliği veri tutarlılığı ve kalitesiyle dengelemeye yardımcı olur. JSON Şema standartlarını ve MongoDB’ye özgü bsonType anahtar kelimesini kullanarak, koleksiyonlarınıza güçlü doğrulama kuralları ekleyebilirsiniz.

Şema doğrulama sayesinde, uygulamanızın veri katmanında beklenmeyen veri yapılarıyla karşılaşma riskini azaltır, uygulama hatalarını önler ve veritabanınızın daha öngörülebilir ve yönetilebilir olmasını sağlarsınız. Özellikle büyük ekiplerin çalıştığı veya veri kalitesinin kritik olduğu projelerde şema doğrulama, sağlam ve güvenilir MongoDB uygulamaları geliştirmenin vazgeçilmez bir parçasıdır. Doğrulama seviyeleri ve eylemleri gibi seçeneklerle, bu özelliği projenizin özel ihtiyaçlarına göre uyarlayabilir ve aşamalı olarak uygulayabilirsiniz. MongoDB’de şema doğrulama kullanmak, veri bütünlüğünü sağlamanın ve uygulama güvenilirliğini artırmanın en etkili yollarından biridir.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.