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.
Gördüklerinizin basitleştirilmiş bir sürümü şöyle olabilir:
Ş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:
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"});Altyapı:
❌ title zorunlu olduğundan bu, doğrulama hatasıyla başarısız olacaktı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"});Altyapı:
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:
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.
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.
Ş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"}}}}}}});Altyapı:
Bu, puan 10’dan büyük olduğu için bir doğrulama hatası oluşturacaktır. Ş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"}Altyapı:
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"}}}}}}}}});Altyapı:
Ş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.
Ş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 defaultAltyapı:
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:
Bu, title alanı eksik olan veya title alanı yanlış türde olan belgeleri döndürü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.
Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!
MongoDB şemasız olabilir, ancak bu verinizin dağınık olacağı anlamına gelmez.
Bu makalede, şema doğrulamasının temellerinden
$jsonSchemaoperatö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ü
$jsonSchemaoperatö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_mflixveritabanı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:
findOne() ile veri kümesini keşfetme
Filmler koleksiyonundaki belgelerden birini inceleyelim:
Gördüklerinizin basitleştirilmiş bir sürümü şöyle olabilir:
Ş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
$jsonSchemakullanarak ilk doğrulama şemamızı tanımlayacağız.Desteklenen anahtar sözcükler, uzantılar ve sınırlamalar
MongoDB’nin
$jsonSchemadoğ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:
MongoDB, tam JSON Schema’dan bazı gelişmiş özellikleri bilerek dışarıda bırakır, örneğin:
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,
$jsonSchemakullanarak bazı temel kuralları zorlayan yeni bir koleksiyon oluşturalım. Yaygın birkaç kısıtlamayla başlayacağız:Bu yeni koleksiyona
validated_moviesadını vereceğiz.Koleksiyonu oluşturma
Doğrulamayla koleksiyonu oluşturmak için aşağıdaki komutu çalıştırın:
Geçerli bir belge ekleme
Şimdi, şemaya uyan bir belge ekleyelim:
✅ Bu başarılı olmalı.
Geçersiz bir belge ekleme
titlealanı eksik olan bir belge eklemeyi deneyin:❌
titlezorunlu olduğundan bu, doğrulama hatasıyla başarısız olacaktı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,
collModkomutunu 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_mflixveritabanı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
titlealanı olmalı.Koleksiyondaki doğrulama kurallarını inceleme
collModkomutuylamovieskoleksiyonunu 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:
Bu, koleksiyondaki doğrulama kurallarını tanımlayan
$jsonSchemanesnesini 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
Şemayı ihlal eden bir belge eklemeyi deneyin:
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.
Ş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,
$jsonSchemaher 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,votesveidgibi alanlara sahip gömülü birimdbnesnesi içerir. Şunları güvence altına alan bir kuralı zorlayalım:imdbbir nesnedir (varsa).imdb.rating0 ile 10 arasında bir sayıdır.Bunu şöyle tanımlarsınız:
İç içe belgeyi test etme
✅ Geçerli ekleme:
❌ Geçersiz ekleme (aralık dışında puan):
Bu, puan 10’dan büyük olduğu için bir doğrulama hatası oluşturacaktır.
Ş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:
genresbir dize dizisi olmalı.Bunu şemanıza ekleyin:
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.
$jsonSchemaile, 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:
Doğrulamalı bir koleksiyon oluşturma
Geçerli bir belge ekleme:
Geçersiz bir belge ekleme:
Bu, şu nedenlerle başarısız olacaktır:
rateddeğeri.genresdizisi.imdb.rating.tomatoes.viewer.rating.Ş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
Bu seçenek, hangi işlemlerin şema doğrulamasına tabi olacağını kontrol eder.
Ne zaman kullanılır:
validationAction
Bu seçenek, bir belge doğrulama kurallarını ihlal ettiğinde MongoDB’nin nasıl yanıt vereceğini kontrol eder.
Ö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:
Örnek: Uyarıdan Hataya Geçiş
Diyelim ki şu şekilde başladınız:
Uygulama davranışını gözlemledikten sonra, sıkı zorlamaya geçebilirsiniz:
Ş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
$jsonSchemakullanı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:
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
$setkullanı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ı zorlayanvalidationLevel: "strict"kullanın.Boş diziler geçmemesi gerekirken geçiyor
minItemsbelirtmeyi unutursanız, boş bir dizi geçer:minItems: 1kullanarak 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.ratingzorunluysa ancakimdbtamamen eksikse, MongoDBrating’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
$norveya$notile$jsonSchemaoperatö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:
Bu, title alanı eksik olan veya title alanı yanlış türde olan belgeleri döndürü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:
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.
$jsonSchemaile, yapıyı zorlayan güçlü doğrulama kuralları tanımlarken MongoDB’nin esnekliğinden faydalanabilirsiniz.Bu makale boyunca şunları öğrendiniz:
İ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.