Ana içeriğe geç

MongoDB Şema Doğrulaması: Örneklerle Pratik Rehber

Bu rehber, şema doğrulaması kullanarak MongoDB'de veriyi temiz ve tutarlı tutmayı, esneklik ile yapıyı dengelemeyi öğretir.
· 12 dk. oku

Yapay Zeka ile Keşfedin

MongoDB şemasız olabilir, ancak bu verinizin dağınık olacağı anlamına gelmez.

Bu makalede, şema doğrulamasının temellerinden $jsonSchema operatörüyle ileri düzey kullanım senaryolarına kadar her şeyi öğreneceksiniz. Zorunlu alanları nasıl uygulayacağınızı, veri türlerini nasıl kısıtlayacağınızı, kalıplar uygulayıp iç içe belgeleri nasıl doğrulayacağınızı keşfedeceksiniz. 

Ayrıca ekleme ve güncellemeler sırasında doğrulamanın nasıl çalıştığını, mevcut koleksiyonların nasıl değiştirileceğini ve farklı doğrulama düzeyleri ile eylemlerin ne zaman kullanılacağını da ele alacağız. 

Sonunda, MongoDB koleksiyonlarınıza şema doğrulamasını uygulama konusunda kendinize güveneceksiniz; verinizi temiz ve öngörülebilir tutarken MongoDB'nin sunduğu esneklikten de vazgeçmeyeceksiniz. Daha fazla bilgi edinmek için şema doğrulaması videomuzu da izleyebilirsiniz.

MongoDB'de Şema Doğrulaması Neden Önemlidir?

MongoDB’nin dinamik belge modeli, aynı koleksiyondaki belgelerin farklı alanlara veya yapılara sahip olmasına izin vererek hız ve esneklik sunar. Bu, erken geliştirme veya hızlı iterasyon sırasında büyük bir avantajdır. Ancak, aynı esneklik uygulamanız büyüdükçe tutarsız, eksik veya geçersiz verilere yol açarak hızla bir dezavantaja dönüşebilir.

İşte burada şema doğrulaması devreye girer. Belgeleriniz için zorunlu alanlar, belirli veri türleri veya iç içe yapılar gibi kurallar tanımlamanıza olanak tanır ve bunu yaparken de MongoDB’nin esnek doğasını benimser.

Bu makalede, bu kuralları koleksiyonlarınıza uygulamak için MongoDB’nin güçlü $jsonSchema operatörünü nasıl kullanacağınızı öğreneceksiniz. İster yeni bir uygulamada hatalı eklemeleri önlemek, ister eski bir veritabanına doğrulama kurallarını sonradan eklemek isteyin, şema doğrulaması verinizin temiz kalmasını, sorgularınızın öngörülebilir olmasını ve uygulamanızın kararlı çalışmasını sağlar.

MongoDB ve Python ile çalışmaya yeni başladıysanız, bu MongoDB giriş kursu, şema doğrulamasına dalmadan önce sorgular ve entegrasyonlarla uygulamalı olarak çalışmak için harika bir yoldur.

Başlamadan Önce

Bu rehberden en iyi şekilde yararlanmak için bir MongoDB Atlas kümesine erişiminiz olmalı. Ücretsiz katman, takip etmek için fazlasıyla yeterlidir.

Kavramları mümkün olduğunca net ve uygulanabilir kılmak için, bir MongoDB Atlas örnek veri kümesi—özellikle sample_mflix veritabanını—kullanacağız. Bu veri kümesi, filmler, yorumlar, kullanıcılar ve sinemalar gibi koleksiyonlar içerir; her örneği göstermek için makale boyunca bunlara atıfta bulunacağız. Veri kümesi; iç içe nesneler, diziler, dizgiler, sayılar ve isteğe bağlı alanlar gibi alanları olan belgeler içerir.

Örnek veri kümesini yükleyin (gerekirse)

1. MongoDB Atlas kontrol panelinize gidin.

2. Kümenizi seçin, “…” düğmesine tıklayın ve Load Sample Dataset’i seçin.

3. sample_mflix veritabanı kullanılabilir olana kadar birkaç dakika bekleyin.

Şema Doğrulamasıyla Başlarken

Veri kümeniz yüklendikten sonra MongoDB Shell (mongosh) veya MongoDB Compass kullanarak kümenize bağlanın ve ardından veri kümesine geçin:

use sample_mflix

findOne() ile veri kümesini keşfetme

Filmler koleksiyonundaki belgelerden birini inceleyelim:

db.movies.findOne()

Gördüklerinizin basitleştirilmiş bir sürümü şöyle olabilir:

Bu sorgu, sample_mflix veritabanındaki movies koleksiyonundan tek bir örnek belge getirmek için findOne() kullanır. Sonuç; title, year, genres ve imdb ile tomatoes.viewer gibi iç içe nesneler dahil çeşitli alanları gösterir.

Şekil 1. Bu sorgu, sample_mflix veritabanındaki movies koleksiyonundan tek bir örnek belge getirmek için findOne() kullanır. Sonuç; title, year, genres ve imdb ile tomatoes.viewer gibi iç içe nesneler dahil çeşitli alanları gösterir.

Bu belge; skaler değerler, diziler ve iç içe nesnelerin bir karışımını içerir ve bu da onu çeşitli doğrulama tekniklerini göstermek için ideal kılar. Bir sonraki bölümde, bu yapıya dayalı yeni bir koleksiyon oluşturacak ve $jsonSchema kullanarak ilk doğrulama şemamızı tanımlayacağız.

Desteklenen anahtar sözcükler, uzantılar ve sınırlamalar

MongoDB’nin $jsonSchema doğrulaması, bazı değişiklik ve çıkarımlar ile JSON Schema Draft 4 spesifikasyonuna dayanır. Orijinal özelliklerin tümü desteklenmese de MongoDB, BSON belgelerini doğrulamak için uygun, odaklı ve pratik bir alt küme sunar.

En sık kullanılan anahtar sözcüklerden bazıları şunlardır:

  • bsonType: MongoDB’ye özgü tür anahtar sözcüğü (ör. "string", "int", "array", "object")
  • required: Hangi alanların bulunmasının zorunlu olduğunu belirtir
  • minimum/maximum: Sayısal aralık doğrulaması için
  • pattern: Düzenli ifadelerle dize biçimi doğrulaması için
  • enum: Bir alanı izin verilen değerler kümesiyle sınırlar
  • items, minItems, maxItems: Dizi doğrulaması için
  • properties: Bir nesnenin içindeki alanlar için kuralları tanımlar
  • additionalProperties: Fazladan (tanımlanmamış) alanlara izin verilip verilmediğini kontrol eder

MongoDB, tam JSON Schema’dan bazı gelişmiş özellikleri bilerek dışarıda bırakır, örneğin:

  • Şema referansları ($ref).
  • Koşullu mantık (if/then/else).
  • Bileşim operatörleri (oneOf, allOf, anyOf).

Desteklenen seçeneklerin tam listesi için, resmi MongoDB $jsonSchema belgelerine göz atın.

Bu makalede, aşırı karmaşıklığa kapılmadan, gerçek dünyadaki yaygın doğrulama ihtiyaçlarını karşılamaya yetecek en pratik ve yaygın olarak desteklenen anahtar sözcüklere odaklanacağız.

MongoDB’nin NoSQL ekosistemindeki yerini daha geniş açıdan anlamak için bu kapsamlı eğitimi inceleyin.

Temel Doğrulamayla Koleksiyon Oluşturma

Artık bir film belgesinin yapısını gördüğümüze göre, $jsonSchema kullanarak bazı temel kuralları zorlayan yeni bir koleksiyon oluşturalım. Yaygın birkaç kısıtlamayla başlayacağız:

  • title: dize olmalı ve zorunludur
  • year: tamsayı olmalı ve zorunludur
  • genres: dize dizisi olmalı
  • runtime: pozitif bir tamsayı olmalı

Bu yeni koleksiyona validated_movies adını vereceğiz.

Koleksiyonu oluşturma

Doğrulamayla koleksiyonu oluşturmak için aşağıdaki komutu çalıştırın:

db.createCollection("validated_movies", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["title", "year", "runtime"],
      properties: {
        title: {
          bsonType: "string",
          description: "must be a string and is required"
        },
        year: {
          bsonType: "int",
          minimum: 1888,
          description: "must be an integer >= 1888 (year of the first film)"
        },
        runtime: {
          bsonType: "int",
          minimum: 1,
          description: "must be a positive integer and is required"
        },
        genres: {
          bsonType: "array",
          items: {
            bsonType: "string"
          },
          description: "must be an array of strings"
        }
      }
    }
  },
  validationLevel: "strict",
  validationAction: "error"
});

Geçerli bir belge ekleme

Şimdi, şemaya uyan bir belge ekleyelim:

db.validated_movies.insertOne({
  title: "Inception",
  year: 2010,
  runtime: 148,
  genres: ["Action", "Sci-Fi", "Thriller"]
});

✅ Bu başarılı olmalı.

Geçersiz bir belge ekleme

title alanı eksik olan bir belge eklemeyi deneyin:

db.validated_movies.insertOne({
  year: 2020,
  runtime: 95,
  genres: ["Drama"]
});

❌ title zorunlu olduğundan bu, doğrulama hatasıyla başarısız olacaktır.İlk komut, gerekli tüm alanları ve veri türlerini sağlayarak validated_movies koleksiyonuna geçerli bir film belgesi ekler. İkinci komut, zorunlu title alanı olmadan belge eklemeye çalışır ve doğrulama hatasıyla sonuçlanır.

Şekil 2. İlk komut, gerekli tüm alanları ve veri türlerini sağlayarak validated_movies koleksiyonuna geçerli bir film belgesi ekler. İkinci komut, zorunlu title alanı olmadan belge eklemeye çalışır ve doğrulama hatasıyla sonuçlanır.

Mevcut Koleksiyonlarla Çalışma

Şema doğrulamasını kullanmak için sıfırdan başlamanıza gerek yok. MongoDB, collMod komutunu kullanarak mevcut koleksiyonlara doğrulama kuralları uygulamanıza izin verir. Bu, mevcut belgelere dokunmadan eski bir veri kümesine yapı eklemek istediğinizde özellikle kullanışlıdır.

Bu bölümde, sample_mflix veritabanındaki movies koleksiyonuna bir doğrulayıcı uygulayacağız.

collMod ile doğrulayıcı ekleme

Basit bir kuralı zorlayalım: Her film belgesinin dize türünde bir title alanı olmalı.

db.runCommand({
  collMod: "movies",
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["title"],
      properties: {
        title: {
          bsonType: "string",
          description: "must be a string and is required"
        }
      }
    }
  },
  validationLevel: "moderate",
  validationAction: "warn"
});

Koleksiyondaki doğrulama kurallarını inceleme

collMod komutuyla movies koleksiyonunu değiştirdikten sonra, şu anda hangi doğrulama kurallarının etkin olduğunu doğrulamak isteyebilirsiniz.

Geçerli şema doğrulayıcısını kontrol etmek için şunu çalıştırın:

db.getCollectionInfos({ name: "movies" })[0].options.validator

Bu, koleksiyondaki doğrulama kurallarını tanımlayan $jsonSchema nesnesini döndürür. Özellikle, uyarıdan hataya geçmek veya zorunlu alanların yapısını güncellemek gibi mod geçişlerinden sonra yapılandırmanızın doğru uygulandığını doğrulamak için kullanışlıdır.

validationLevel ve validationAction'ı anlama

  • validationLevel: "moderate": Yalnızca eklenen veya güncellenen belgeleri doğrular. Şemayla eşleşmeyen mevcut belgeler hata tetiklemez.
  • validationAction: "warn": Geçersiz yazmaları reddetmek yerine, MongoDB bir uyarı kaydeder. Bu, üretimde doğrulamayı zorlamadan önce şema ihlallerini izlemek istediğinizde kullanışlıdır.

Şemayı ihlal eden bir belge eklemeyi deneyin:

db.movies.insertOne({
  year: 2023
});

Günlüklerde bir uyarı görürsünüz, ancak yazma başarılı olacaktır. Daha sonra kuralı kesin olarak uygulamak için eylemi "error" olarak değiştirebilirsiniz.

insertOne() komutu, doğrulama eylemi "warn" olarak ayarlandığı için şema kuralını ihlal eden bir belgeyi başarıyla ekler. MongoDB yazmayı kabul eder, ancak "error" zorlanmış olsaydı eksik title alanı doğrulama hatasını tetiklerdi.

Şekil 3. insertOne() komutu, doğrulama eylemi "warn" olarak ayarlandığı için şema kuralını ihlal eden bir belgeyi başarıyla ekler. MongoDB yazmayı kabul eder, ancak "error" zorlanmış olsaydı eksik title alanı doğrulama hatasını tetiklerdi.

İç İçe Belgeleri ve Dizileri Doğrulama

MongoDB belgeleri sıkça iç içe yapılar içerir; nesnelerin içinde nesneler ve değer dizileri gibi. Neyse ki, $jsonSchema her ikisini de doğrulamayı destekler. Filmler koleksiyonundaki alanları kullanarak alt belgeler ve dizi içerikleri için kuralların nasıl uygulanacağını inceleyelim.

İç içe bir belgeyi doğrulama

Filmler koleksiyonunda, her belge rating, votes ve id gibi alanlara sahip gömülü bir imdb nesnesi içerir. Şunları güvence altına alan bir kuralı zorlayalım:

  • imdb bir nesnedir (varsa).
  • imdb.rating 0 ile 10 arasında bir sayıdır.

Bunu şöyle tanımlarsınız:

db.createCollection("validated_nested", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      properties: {
        imdb: {
          bsonType: "object",
          properties: {
            rating: {
              bsonType: "double",
              minimum: 0,
              maximum: 10,
              description: "Must be a number between 0 and 10"
            }
          }
        }
      }
    }
  }
});

İç içe belgeyi test etme

✅ Geçerli ekleme:

db.validated_nested.insertOne({
  title: "Interstellar",
  imdb: { rating: 8.6 }
});

❌ Geçersiz ekleme (aralık dışında puan):

db.validated_nested.insertOne({
  title: "Bad Movie",
  imdb: { rating: 12.5 }
});

Bu, puan 10’dan büyük olduğu için bir doğrulama hatası oluşturacaktır.Bu ekleme işlemi, iç içe imdb nesnesindeki rating alanı şemada tanımlanan 10’luk üst sınırı aştığı için başarısız olur. $jsonSchema kuralının ihlali nedeniyle MongoDB bir doğrulama hatası verir.      Şekil 4. Bu ekleme işlemi, iç içe imdb nesnesindeki rating alanı şemada tanımlanan 10’luk üst sınırı aştığı için başarısız olur. $jsonSchema kuralının ihlali nedeniyle MongoDB bir doğrulama hatası verir.

Dizileri doğrulama

Dizi kısıtlamalarını da uygulayabilirsiniz. Diyelim ki şunları sağlamak istiyorsunuz:

  • genres bir dize dizisi olmalı.
  • Dizi en az bir öğe içermeli.

Bunu şemanıza ekleyin:

genres: {
  bsonType: "array",
  minItems: 1,
  items: {
    bsonType: "string"
  },
  description: "Must be a non-empty array of strings"
}

Birden Fazla Kısıtlamayı Birleştirme

Gerçek dünyadaki uygulamalarda, belgelerinizin genellikle birden fazla doğrulama kuralını aynı anda karşılaması gerekir—zorunlu alanlar, izin verilen değerler, türler ve iç içe yapıları kapsayacak şekilde. $jsonSchema ile, birden çok kısıtlamayı tek bir şema tanımında kolayca birleştirebilirsiniz.

Filmler belgesi yapısını kullanarak daha kapsamlı bir örnek oluşturalım. Aşağıdaki kuralları zorlayacağız:

  • title: zorunlu, dize olmalı
  • year: zorunlu, tamsayı, ≥ 1888
  • rated: isteğe bağlı, ancak önceden tanımlı bir değer kümesiyle eşleşmeli
  • genres: boş olmayan bir dize dizisi olmalı
  • imdb.rating: 0 ile 10 arasında sayı
  • tomatoes.viewer.rating: isteğe bağlı, 0 ile 5 arasında sayı

Doğrulamalı bir koleksiyon oluşturma

db.createCollection("validated_full", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["title", "year"],
      properties: {
        title: {
          bsonType: "string",
          description: "Title is required and must be a string"
        },
        year: {
          bsonType: "int",
          minimum: 1888,
          description: "Year must be an integer >= 1888"
        },
        rated: {
          enum: ["G", "PG", "PG-13", "R", "NC-17"],
          description: "Must be a valid MPAA rating"
        },
        genres: {
          bsonType: "array",
          minItems: 1,
          items: { bsonType: "string" },
          description: "Must be a non-empty array of strings"
        },
        imdb: {
          bsonType: "object",
          properties: {
            rating: {
              bsonType: "double",
              minimum: 0,
              maximum: 10,
              description: "IMDB rating must be between 0 and 10"
            }
          }
        },
        tomatoes: {
          bsonType: "object",
          properties: {
            viewer: {
              bsonType: "object",
              properties: {
                rating: {
                  bsonType: "double",
                  minimum: 0,
                  maximum: 5,
                  description: "Viewer rating must be between 0 and 5"
                }
              }
            }
          }
        }
      }
    }
  }
});

Geçerli bir belge ekleme: 

db.validated_full.insertOne({
  title: "The Matrix",
  year: 1999,
  rated: "R",
  genres: ["Action", "Sci-Fi"],
  imdb: { rating: 8.7 },
  tomatoes: { viewer: { rating: 4.2 } }
});

Geçersiz bir belge ekleme:

db.validated_full.insertOne({
  title: "Untitled Project",
  year: 2025,
  rated: "Unrated",
  genres: [],
  imdb: { rating: 15 },
  tomatoes: { viewer: { rating: 6.1 } }
});

Bu, şu nedenlerle başarısız olacaktır:

  • Geçersiz rated değeri.
  • Boş genres dizisi.
  • 10’u aşan imdb.rating.
  • 5’i aşan tomatoes.viewer.rating.

Bu ekleme işlemi, validated_full koleksiyonunda birden fazla şema ihlali nedeniyle başarısız olur. rated alanı enum tarafından izin verilmeyen bir değer içerir, genres minItems kuralını ihlal eden boş bir dizidir, imdb.rating 10’luk üst sınırı aşar ve türü yanlıştır; tomatoes.viewer.rating ise izin verilen 5’lik üst sınırı aşar. MongoDB ayrıntılı bir doğrulama hatasıyla eklemeyi reddeder.

Şekil 5. Bu ekleme işlemi, validated_full koleksiyonunda birden fazla şema ihlali nedeniyle başarısız olur. rated alanı enum tarafından izin verilmeyen bir değer içerir, genres minItems kuralını ihlal eden boş bir dizidir, imdb.rating 10’luk üst sınırı aşar ve türü yanlıştır; tomatoes.viewer.rating ise izin verilen 5’lik üst sınırı aşar. MongoDB ayrıntılı bir doğrulama hatasıyla eklemeyi reddeder.

Doğrulama Düzeyleri ve Eylemlerinin Açıklaması

MongoDB, şema doğrulamasının nasıl ve ne zaman uygulanacağı üzerinde ince ayar yapma olanağı sunar. Doğrulama kurallarını tanımlarken, iki seçenek veritabanınızın davranışını etkiler:

  • validationLevel: Kuralın ne zaman uygulanacağı
  • validationAction: Bir belge kuralla eşleşmediğinde ne olacağı

validationLevel

Bu seçenek, hangi işlemlerin şema doğrulamasına tabi olacağını kontrol eder.

  • strict: Tüm eklemeler ve güncellemeler şemaya uymalıdır. Bu, varsayılan ve en güvenli moddur.
  • moderate: Yalnızca eklenen veya güncellenen belgeler doğrulanır. Geçersiz olsa bile mevcut belgelere dokunulmaz.

Ne zaman kullanılır:

  • strict’i, şemayı baştan itibaren tam olarak zorlamak istediğiniz yeni koleksiyonlar için kullanın.
  • moderate’ı, doğrulamayı halihazırda eski veya yapısız veri içeren koleksiyonlara uygularken kullanın.

validationAction

Bu seçenek, bir belge doğrulama kurallarını ihlal ettiğinde MongoDB’nin nasıl yanıt vereceğini kontrol eder.

  • error: Yazma işlemi reddedilir ve bir doğrulama hatası döndürülür.
  • warn: Yazma kabul edilir, ancak sunucu tarafından içsel bir uyarı kaydedilir.

Önemli: MongoDB Atlas’ta, warn tarafından oluşturulan uyarılar kullanıcılara görünmez—UI’da veya standart günlüklerde bunları görmezsiniz.

Ne zaman kullanılır:

  • warn’ı, geliştirme sırasında veya kademeli geçişte, yazmaları engellemeden ihlalleri izlemek için kullanın.
  • Uygulamanızın geçerli belgeler yazdığından emin olduğunuzda ve şemayı sıkı biçimde uygulamak istediğinizde error’a geçin.

Örnek: Uyarıdan Hataya Geçiş

Diyelim ki şu şekilde başladınız:

db.runCommand({
  collMod: "validated_full",
  validationAction: "warn",
  validationLevel: "moderate"
});

Uygulama davranışını gözlemledikten sonra, sıkı zorlamaya geçebilirsiniz:

db.runCommand({
  collMod: "validated_full",
  validationAction: "error",
  validationLevel: "strict"
});

validated_full koleksiyonunun doğrulama davranışını değiştirmek için iki collMod komutu kullanılır. İlk komut, doğrulama eylemini "warn" ve doğrulama düzeyini "moderate" olarak ayarlayarak geçersiz belgelerin eklenmesine izin verir ancak içsel uyarılar kaydeder. İkinci komut, doğrulama eylemini "error" ve doğrulama düzeyini "strict" olarak ayarlayarak tüm ekleme ve güncellemelerin şemaya tam olarak uymasını zorunlu kılar.

Şekil 6. validated_full koleksiyonunun doğrulama davranışını değiştirmek için iki collMod komutu kullanılır. İlk komut, doğrulama eylemini "warn" ve doğrulama düzeyini "moderate" olarak ayarlayarak geçersiz belgelerin eklenmesine izin verir ancak içsel uyarılar kaydeder. İkinci komut, doğrulama eylemini "error" ve doğrulama düzeyini "strict" olarak ayarlayarak tüm ekleme ve güncellemelerin şemaya tam olarak uymasını zorunlu kılar.

Artık geçersiz herhangi bir ekleme veya güncelleme bir hata mesajıyla engellenecektir.

Yaygın Tuzaklar ve Hata Ayıklama İpuçları

Şema doğrulamasıyla çalışırken küçük hatalar kafa karıştırıcı hatalara yol açabilir—ya da daha da kötüsü, belgeleriniz kurallarınızı sessizce atlayabilir. İşte en sık karşılaşılan sorunlardan bazıları ve bunlardan nasıl kaçınacağınız:

Yanlış bsonType değerleri

$jsonSchema kullanırken en yaygın hatalardan biri JSON türleri ile MongoDB’nin “bsonType”ını karıştırmaktır. "string" ve "array" açık olsa da sayılar ve boolean’lar gibi diğerleri kafa karıştırıcı olabilir.

Örneğin:

  • Tam sayılar için "int" veya "long" kullanın.
  • Kayan noktalı sayılar için "double" kullanın.
  • Doğru/yanlış değerleri için "bool" ("boolean" değil) kullanın.
  • Alt belgeler için "object" kullanın ("dict" veya "map" değil).
  • Listeler için "array" kullanın.

Bir alanın hangi türde saklandığından emin değilseniz, Mongo kabuğunda typeof kullanarak bir belgeyi inceleyebilir veya MongoDB Compass ile verileri gözden geçirebilirsiniz.

Kısmi güncellemelerde eksik zorunlu alanlar

$set kullanırken, doğrulama yalnızca değiştirilen alanları kontrol eder. Tam bir şema kontrolü bekliyorsanız, tam belge değiştirme yapmaya dikkat edin veya uygulama mantığınızla tam yapıyı zorlayan validationLevel: "strict" kullanın.

Boş diziler geçmemesi gerekirken geçiyor

minItems belirtmeyi unutursanız, boş bir dizi geçer:

	genres: {
	  bsonType: "array",
	  items: { bsonType: "string" }
	}
	// Accepts empty arrays by default

minItems: 1 kullanarak en az bir değer olmasını sağlayın.

warn modunda hata yok

Daha önce de değindiğimiz gibi, validationAction: "warn" yazmaları engellemez veya MongoDB Atlas’ta hataları görünür kılmaz. Yalnızca içsel olarak günlüğe yazar, bu nedenle doğrulama “çalışmıyor” gibi görünebilir.

Geliştirme veya test ortamlarında sorunları erken yakalamak için "error" modunu kullanın.

Üst nesne eksikse iç içe alan yolları kontrol edilmez

imdb.rating zorunluysa ancak imdb tamamen eksikse, MongoDB rating’i kontrol etmez.

İç içe alanlarda doğrulamayı zorlamak için, üst nesnenin ya zorunlu olduğundan ya da bsonType: "object" tanımına sahip olduğundan emin olun.

Şemaya uymayan belgeleri sorgulama veya güncelleme

Mevcut bir koleksiyona doğrulama uyguladıktan sonra, yeni şemaya uymayan belgeleri belirlemek faydalı olur. Bunu, bir sorguda $nor veya $not ile $jsonSchema operatörünü kullanarak yapabilirsiniz.

Örnek: movies koleksiyonundaki geçersiz belgeleri bulun

Diyelim ki şemanız, "string" türünde bir title gerektiriyor. Eşleşmeyen belgeleri bulmak için şunu çalıştırabilirsiniz:

db.movies.find({
  $nor: [
    { $jsonSchema: {
        bsonType: "object",
        required: ["title"],
        properties: {
          title: { bsonType: "string" }
        }
      }
    }
  ]
});

Bu, title alanı eksik olan veya title alanı yanlış türde olan belgeleri döndürür.

$jsonSchema ile $nor kullanan bu sorgu, movies koleksiyonunda title alanı string olmayan belgeleri bulur. Sonuç, yalnızca year alanı içeren ve title gerektiren şemayı ihlal eden _id: 683ce0050bd195c35e417534 değerli bir belgeyi gösterir. Bu teknik, daha sıkı doğrulama kurallarını zorlamadan önce geçersiz belgeleri belirlemek için kullanışlıdır.

Şekil 7. $jsonSchema ile $nor kullanan bu sorgu, movies koleksiyonunda title alanı string olmayan belgeleri bulur. Sonuç, yalnızca year alanı içeren ve title gerektiren şemayı ihlal eden _id: 683ce0050bd195c35e417534 değerli bir belgeyi gösterir. Bu teknik, daha sıkı doğrulama kurallarını zorlamadan önce geçersiz belgeleri belirlemek için kullanışlıdır.

Bu yaklaşımı ayrıca şu amaçlarla da kullanabilirsiniz:

  • "warn"dan "error"a geçmeden önce eski belgeleri denetlemek.
  • Geçersiz belgeleri programlı olarak temizlemek veya düzeltmek.
  • Şema uyumluluğu hakkında raporlar oluşturmak.

Kapanış: Esnekliği Kaybetmeden Temiz Veri

MongoDB’nin şemasız tasarımı en büyük güçlü yanlarından biridir, ancak bu verinizi kontrolsüz bırakmanız gerektiği anlamına gelmez. $jsonSchema ile, yapıyı zorlayan güçlü doğrulama kuralları tanımlarken MongoDB’nin esnekliğinden faydalanabilirsiniz.

Bu makale boyunca şunları öğrendiniz:

  • Doğrulama kuralları olan koleksiyonlar oluşturmak.
  • Yeni ve mevcut koleksiyonlara kısıtlamalar uygulamak.
  • Nesneler ve diziler için iç içe doğrulama kullanmak.
  • Doğrulama modlarını ve eylemlerini yapılandırmak.
  • Şemalarınızı güvenle hata ayıklamak ve iyileştirmek.

İster sıfırdan bir uygulama geliştiriyor ister eski bir sisteme yapı ekliyor olun, şema doğrulaması verinizi korumak için gerekli araçları geliştirmenin hızını düşürmeden sunar.

Sonraki Adımlar ve Kaynaklar

Daha derine dalmak ister misiniz? Bu kaynaklara göz atın:

Mülakatlara mı hazırlanıyorsunuz? Bu en iyi MongoDB soruları şema doğrulaması ve daha fazlası gibi konulardaki bilginizi ölçecek. Becerilerinizi doğrulamak mı istiyorsunuz? Bu sertifikasyon rehberi, MongoDB’de sertifika almak için bilmeniz gereken her şeyi özetler.

Unutmayın, küçük başlayın, "warn" ile test edin ve emin olduğunuzda "error"a geçin—gelecekteki siz (ve veriniz) size minnettar olacaktır.

SSS

Şema doğrulaması $set kullanılarak yapılan kısmi güncellemelerle nasıl etkileşir?

$set gibi operatörlerle bir güncelleme yaptığınızda, MongoDB yalnızca değiştirilen alanları doğrular—tüm belgeyi değil—tam belge değişimi yapmadığınız ve validationLevel: "strict" kullanmadığınız sürece. Tam doğrulamayı sağlamak için belge değişimini kullanabilir veya yapıyı uygulama katmanınızda zorlayabilirsiniz.

Bir alanın yalnızca başka bir alan varsa mevcut olmasını zorlayabilir miyim?

Doğrudan değil. MongoDB’nin $jsonSchema’sı koşullu doğrulamayı (if/then/else) desteklemez. Ancak bazen bunu, ifade tabanlı doğrulamayla (ör. $expr ile $cond kullanarak) veya $jsonSchema’yı bir $and sarmalayıcıyla birleştirerek yaklaşık olarak elde edebilirsiniz. Daha karmaşık mantık için bunu uygulama katmanında ele alın.

Doğrulama kuralları, şema varsayılanları veya dönüşümlerinden önce mi sonra mı değerlendirilir?

MongoDB, veritabanı düzeyinde varsayılan değerler veya alan dönüşümleri uygulamaz. Doğrulama, belge alındığı haliyle uygulanır. Her türlü varsayılan atama, dönüştürme veya dönüşümü, veritabanına yazmadan önce uygulama mantığınızda ele almalısınız.

Eski verileri bozmadan zaman içinde şemaları sürümleyebilir veya evrimleştirebilir miyim?

Evet. Yaygın bir strateji, doğrulama düzeyini kademeli olarak daha katı kurallar uygularken "moderate" olarak kullanmaktır. Ayrıca belgelere bir schemaVersion alanı ekleyerek uygulamanızda koşullu mantık uygulayabilirsiniz. MongoDB yerleşik şema sürümleme sunmaz; bu nedenle sürüm kontrolü haricen yönetilmelidir.

Şema doğrulaması, ekleme ve güncellemelerin performansını etkiler mi?

Biraz—ama genellikle çoğu uygulamada fark edilir düzeyde değildir. Doğrulama, yazma işlemi başına küçük bir ek yük getirir; ancak geçersiz verileri erken reddederek çok daha maliyetli sorunları önleyebilir. Çok derin iç içe veya çok büyük belgeleri doğruluyorsanız, buna göre kıyaslama yapın.

Samuel Molling

Yazar

Samuel Molling

Samuel Molling, bulutta güvenli veri altyapısını otomatikleştirme ve ölçeklendirme konusunda tutkulu bir Veritabanı Güvenilirliği Mühendisidir.

Konular

İlgili