{"id":32081,"date":"2025-10-17T13:41:14","date_gmt":"2025-10-17T10:41:14","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=32081"},"modified":"2025-10-17T13:41:14","modified_gmt":"2025-10-17T10:41:14","slug":"mongodbde-sema-dogrulama-schema-validation-nasil-kullanilir","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/mongodbde-sema-dogrulama-schema-validation-nasil-kullanilir\/","title":{"rendered":"MongoDB&#8217;de \u015eema Do\u011frulama (Schema Validation) Nas\u0131l Kullan\u0131l\u0131r?"},"content":{"rendered":"<p><body><\/p>\n<h2>MongoDB&#8217;de \u015eema Do\u011frulama (Schema Validation) Nas\u0131l Kullan\u0131l\u0131r?<\/h2>\n<p>MongoDB, esnek ve \u015femas\u0131z (schema-less) yap\u0131s\u0131yla bilinir. Bu \u00f6zellik, geli\u015ftiricilere veri modellerini h\u0131zla de\u011fi\u015ftirebilme ve farkl\u0131 veri yap\u0131lar\u0131n\u0131 tek bir koleksiyonda bar\u0131nd\u0131rabilme \u00f6zg\u00fcrl\u00fc\u011f\u00fc sunar. Ancak, bu esneklik beraberinde baz\u0131 zorluklar\u0131 da getirebilir. \u00d6zellikle b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalarda veya birden fazla geli\u015ftiricinin \u00e7al\u0131\u015ft\u0131\u011f\u0131 projelerde veri tutarl\u0131l\u0131\u011f\u0131, kalitesi ve \u00f6ng\u00f6r\u00fclebilirli\u011fi \u00f6nemli hale gelir. \u0130\u015fte bu noktada MongoDB&#8217;nin \u015fema do\u011frulama (schema validation) \u00f6zelli\u011fi devreye girer. Bu makale, MongoDB&#8217;de \u015fema do\u011frulaman\u0131n ne oldu\u011funu, neden \u00f6nemli oldu\u011funu ve nas\u0131l etkili bir \u015fekilde kullan\u0131laca\u011f\u0131n\u0131 ayr\u0131nt\u0131l\u0131 olarak ele alacakt\u0131r.<\/p>\n<h3>MongoDB&#8217;nin Esnek \u015eema Yap\u0131s\u0131 ve Do\u011frulama \u0130htiyac\u0131<\/h3>\n<p>MongoDB, belgeleri JSON benzeri BSON format\u0131nda saklayan bir belge tabanl\u0131 (document-oriented) veritaban\u0131d\u0131r. Geleneksel ili\u015fkisel veritabanlar\u0131n\u0131n aksine, MongoDB&#8217;de bir koleksiyondaki belgelerin belirli bir \u015femaya uymas\u0131 zorunlulu\u011fu yoktur. Bu &#8220;\u015femas\u0131z&#8221; yakla\u015f\u0131m, a\u015fa\u011f\u0131daki avantajlar\u0131 sunar:<\/p>\n<p>*   <strong>H\u0131zl\u0131 Geli\u015ftirme:<\/strong> Veritaban\u0131 \u015femas\u0131n\u0131 \u00f6nceden tasarlama ve sabitleme ihtiyac\u0131 ortadan kalkt\u0131\u011f\u0131 i\u00e7in uygulama geli\u015ftirme s\u00fcreci h\u0131zlan\u0131r.<br \/>\n*   <strong>Esneklik:<\/strong> Uygulama gereksinimleri de\u011fi\u015ftik\u00e7e veri modeli kolayca adapte edilebilir. Yeni alanlar eklemek veya mevcut alanlar\u0131 de\u011fi\u015ftirmek \u00e7ok daha basittir.<br \/>\n*   <strong>\u00c7e\u015fitli Veri Tipleri:<\/strong> Ayn\u0131 koleksiyonda farkl\u0131 veri yap\u0131lar\u0131na sahip belgeler saklanabilir, bu da polimorfik verilere uyum sa\u011flar.<\/p>\n<p>Ancak, bu esnekli\u011fin potansiyel dezavantajlar\u0131 da vard\u0131r:<\/p>\n<p>*   <strong>Veri Tutars\u0131zl\u0131\u011f\u0131:<\/strong> Farkl\u0131 belgelerin ayn\u0131 alana farkl\u0131 veri tipleriyle sahip olmas\u0131 veya baz\u0131 belgelerde zorunlu olmas\u0131 gereken alanlar\u0131n eksik olmas\u0131 veri tutars\u0131zl\u0131\u011f\u0131na yol a\u00e7abilir.<br \/>\n*   <strong>Uygulama Hatalar\u0131:<\/strong> Uygulama kodu, belirli bir alan\u0131n varl\u0131\u011f\u0131n\u0131 veya belirli bir veri tipine sahip olmas\u0131n\u0131 beklerken, veritaban\u0131ndaki tutars\u0131zl\u0131klar \u00e7al\u0131\u015fma zaman\u0131 hatalar\u0131na neden olabilir.<br \/>\n*   <strong>Sorgulama Zorluklar\u0131:<\/strong> Tutars\u0131z veri yap\u0131lar\u0131, sorgular\u0131 ve veri analizini zorla\u015ft\u0131rabilir, \u00e7\u00fcnk\u00fc t\u00fcm belgelerin belirli bir yap\u0131ya sahip oldu\u011fu varsay\u0131lamaz.<br \/>\n*   <strong>Bak\u0131m Zorlu\u011fu:<\/strong> Zamanla, veri yap\u0131s\u0131n\u0131n net olmamas\u0131, veritaban\u0131 y\u00f6netimini ve uygulaman\u0131n bak\u0131m\u0131n\u0131 karma\u015f\u0131k hale getirebilir.<\/p>\n<p>\u0130\u015fte bu dezavantajlar\u0131 gidermek ve MongoDB&#8217;nin esnekli\u011fini korurken veri kalitesini art\u0131rmak i\u00e7in \u015fema do\u011frulama \u00f6zelli\u011fi geli\u015ftirilmi\u015ftir. \u015eema do\u011frulama, belirli kurallar tan\u0131mlayarak bir koleksiyona eklenecek veya g\u00fcncellenecek belgelerin bu kurallara uymas\u0131n\u0131 sa\u011flar. Bu sayede, uygulaman\u0131z\u0131n bekledi\u011fi veri yap\u0131s\u0131n\u0131n veritaban\u0131 seviyesinde korunmas\u0131na yard\u0131mc\u0131 olur.<\/p>\n<h3>\u015eema Do\u011frulaman\u0131n Temelleri<\/h3>\n<p>MongoDB&#8217;de \u015fema do\u011frulama, koleksiyon seviyesinde tan\u0131mlan\u0131r ve JSON \u015eema (JSON Schema) standart\u0131na benzer bir s\u00f6zdizimi kullan\u0131r. Do\u011frulama kurallar\u0131, bir koleksiyona yeni belgeler eklenirken (insert) veya mevcut belgeler g\u00fcncellenirken (update) uygulan\u0131r.<\/p>\n<p>Bir koleksiyona \u015fema do\u011frulama kurallar\u0131 eklemek i\u00e7in iki ana y\u00f6ntem vard\u0131r:<\/p>\n<p>1.  <strong>Yeni Bir Koleksiyon Olu\u015ftururken:<\/strong> <code>db.createCollection()<\/code> metodu kullan\u0131l\u0131rken <code>validator<\/code> se\u00e7ene\u011fi belirtilebilir.<br \/>\n2.  <strong>Mevcut Bir Koleksiyonu G\u00fcncellerken:<\/strong> <code>db.runCommand()<\/code> ile <code>collMod<\/code> komutu kullan\u0131larak mevcut bir koleksiyona \u015fema eklenebilir veya mevcut \u015fema g\u00fcncellenebilir.<\/p>\n<p>Do\u011frulama kurallar\u0131, bir JSON nesnesi olarak <code>validator<\/code> alan\u0131nda tan\u0131mlan\u0131r. Bu nesne, belgenin yap\u0131s\u0131n\u0131, alanlar\u0131n tiplerini, aral\u0131klar\u0131n\u0131, zorunluluklar\u0131n\u0131 ve di\u011fer k\u0131s\u0131tlamalar\u0131n\u0131 belirten JSON \u015eema anahtar kelimelerini i\u00e7erir.<\/p>\n<p>\u015eema do\u011frulama ile birlikte iki \u00f6nemli se\u00e7enek daha bulunur:<\/p>\n<p>*   <strong><code>validationLevel<\/code>:<\/strong> Do\u011frulama kurallar\u0131n\u0131n ne kadar kat\u0131 uygulanaca\u011f\u0131n\u0131 belirler.<br \/>\n    *   <code>strict<\/code> (varsay\u0131lan): T\u00fcm ekleme ve g\u00fcncelleme i\u015flemleri i\u00e7in do\u011frulama kurallar\u0131n\u0131 uygular.<br \/>\n    *   <code>moderate<\/code>: Yaln\u0131zca mevcut belgeleri g\u00fcncellerken ve \u015fema taraf\u0131ndan tan\u0131mlanm\u0131\u015f alanlar\u0131 etkilerken do\u011frulama yapar. Yeni belgeler i\u00e7in <code>strict<\/code> gibi davran\u0131r. \u015eema taraf\u0131ndan tan\u0131mlanmam\u0131\u015f alanlar\u0131 i\u00e7eren g\u00fcncellemelerde do\u011frulama uygulanmaz.<br \/>\n    *   <code>off<\/code>: Do\u011frulamay\u0131 devre d\u0131\u015f\u0131 b\u0131rak\u0131r.<br \/>\n*   <strong><code>validationAction<\/code>:<\/strong> Do\u011frulama ba\u015far\u0131s\u0131z oldu\u011funda ne yap\u0131laca\u011f\u0131n\u0131 belirler.<br \/>\n    *   <code>error<\/code> (varsay\u0131lan): Do\u011frulama ba\u015far\u0131s\u0131z olursa, ekleme veya g\u00fcncelleme i\u015flemi reddedilir ve bir hata d\u00f6nd\u00fcr\u00fcl\u00fcr.<br \/>\n    *   <code>warn<\/code>: Do\u011frulama ba\u015far\u0131s\u0131z olsa bile ekleme veya g\u00fcncelleme i\u015flemi ba\u015far\u0131l\u0131 olur, ancak sunucu loglar\u0131na bir uyar\u0131 mesaj\u0131 yaz\u0131l\u0131r. Bu, \u015fema do\u011frulamay\u0131 a\u015famal\u0131 olarak uygulamak veya sadece veri kalitesini izlemek istedi\u011finiz durumlarda kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<p>Bu se\u00e7enekler, geli\u015ftiricilere \u015fema do\u011frulamay\u0131 esnek bir \u015fekilde uygulamalar\u0131 i\u00e7in g\u00fc\u00e7l\u00fc ara\u00e7lar sunar.<\/p>\n<h3>JSON \u015eema ile Do\u011frulama Kurallar\u0131 Olu\u015fturma<\/h3>\n<p>MongoDB&#8217;deki \u015fema do\u011frulama, JSON \u015eema tasla\u011f\u0131n\u0131n bir alt k\u00fcmesini ve MongoDB&#8217;ye \u00f6zg\u00fc baz\u0131 anahtar kelimeleri kullan\u0131r. Bir belgenin yap\u0131s\u0131n\u0131 ve alanlar\u0131n\u0131n \u00f6zelliklerini tan\u0131mlamak i\u00e7in bu anahtar kelimelerden faydalan\u0131l\u0131r.<\/p>\n<h4>Genel JSON \u015eema Anahtar Kelimeleri<\/h4>\n<p>Bu anahtar kelimeler, alanlar\u0131n tiplerini, de\u011fer aral\u0131klar\u0131n\u0131 ve zorunluluklar\u0131n\u0131 belirlemek i\u00e7in kullan\u0131l\u0131r:<\/p>\n<p>*   <strong><code>type<\/code><\/strong>: Bir alan\u0131n veri tipini belirtir. Ge\u00e7erli tipler: <code>object<\/code>, <code>string<\/code>, <code>number<\/code>, <code>array<\/code>, <code>boolean<\/code>, <code>null<\/code>. Bir alan birden fazla tipe sahip olabilir (\u00f6rne\u011fin, <code>[\"string\", \"null\"]<\/code>).<br \/>\n*   <strong><code>properties<\/code><\/strong>: Bir belgenin veya i\u00e7 i\u00e7e ge\u00e7mi\u015f bir nesnenin alanlar\u0131n\u0131 ve her alan i\u00e7in \u00f6zel do\u011frulama kurallar\u0131n\u0131 tan\u0131mlar.<br \/>\n*   <strong><code>required<\/code><\/strong>: Bir dizidir ve belirtilen alanlar\u0131n belgede zorunlu oldu\u011funu g\u00f6sterir. \u00d6rne\u011fin: <code>[\"ad\", \"soyad\", \"email\"]<\/code>.<br \/>\n*   <strong><code>additionalProperties<\/code><\/strong>: <code>properties<\/code> i\u00e7inde belirtilmeyen ek alanlara izin verilip verilmeyece\u011fini belirler. Varsay\u0131lan olarak <code>true<\/code>&#8216;dur. <code>false<\/code> olarak ayarlan\u0131rsa, yaln\u0131zca <code>properties<\/code> i\u00e7inde tan\u0131mlanan alanlara izin verilir.<br \/>\n*   <strong><code>items<\/code><\/strong>: Bir dizinin elemanlar\u0131 i\u00e7in do\u011frulama kurallar\u0131 tan\u0131mlar. T\u00fcm elemanlar ayn\u0131 \u015femaya uymal\u0131d\u0131r.<br \/>\n*   <strong><code>enum<\/code><\/strong>: Bir alan\u0131n alabilece\u011fi belirli de\u011ferlerin bir listesini tan\u0131mlar. Alan\u0131n de\u011feri bu listedeki de\u011ferlerden biri olmal\u0131d\u0131r.<br \/>\n*   <strong><code>minLength<\/code>, <code>maxLength<\/code><\/strong>: <code>string<\/code> tipli alanlar i\u00e7in minimum ve maksimum karakter uzunlu\u011funu belirler.<br \/>\n*   <strong><code>pattern<\/code><\/strong>: <code>string<\/code> tipli alanlar i\u00e7in bir d\u00fczenli ifade (regex) belirler. Alan\u0131n de\u011feri bu d\u00fczenli ifadeye uymal\u0131d\u0131r.<br \/>\n*   <strong><code>minimum<\/code>, <code>maximum<\/code>, <code>exclusiveMinimum<\/code>, <code>exclusiveMaximum<\/code><\/strong>: <code>number<\/code> tipli alanlar i\u00e7in say\u0131sal de\u011fer aral\u0131klar\u0131n\u0131 belirler. <code>exclusive<\/code> olanlar, s\u0131n\u0131r de\u011ferinin dahil edilmedi\u011fini g\u00f6sterir.<br \/>\n*   <strong><code>minItems<\/code>, <code>maxItems<\/code><\/strong>: <code>array<\/code> tipli alanlar i\u00e7in minimum ve maksimum eleman say\u0131s\u0131n\u0131 belirler.<br \/>\n*   <strong><code>uniqueItems<\/code><\/strong>: <code>array<\/code> tipli alanlar i\u00e7in dizideki t\u00fcm elemanlar\u0131n benzersiz olmas\u0131 gerekti\u011fini belirtir.<br \/>\n*   <strong>Mant\u0131ksal Kombinasyon Operat\u00f6rleri (<code>allOf<\/code>, <code>anyOf<\/code>, <code>oneOf<\/code>, <code>not<\/code>):<\/strong><br \/>\n    *   <code>allOf<\/code>: Belgenin t\u00fcm belirtilen \u015femalara uymas\u0131 gerekti\u011fini belirtir.<br \/>\n    *   <code>anyOf<\/code>: Belgenin en az bir belirtilen \u015femaya uymas\u0131 gerekti\u011fini belirtir.<br \/>\n    *   <code>oneOf<\/code>: Belgenin tam olarak bir belirtilen \u015femaya uymas\u0131 gerekti\u011fini belirtir.<br \/>\n    *   <code>not<\/code>: Belgenin belirtilen \u015femaya uymamas\u0131 gerekti\u011fini belirtir.<\/p>\n<h4>MongoDB&#8217;ye \u00d6zg\u00fc <code>bsonType<\/code> Anahtar Kelimesi<\/h4>\n<p>MongoDB, JSON \u015eema&#8217;n\u0131n <code>type<\/code> anahtar kelimesine ek olarak, kendi BSON tiplerini belirtmek i\u00e7in <code>bsonType<\/code> anahtar kelimesini sunar. Bu, \u00f6zellikle <code>ObjectId<\/code>, <code>Date<\/code>, <code>Decimal128<\/code>, <code>Long<\/code>, <code>BinData<\/code>, <code>Timestamp<\/code>, <code>Regex<\/code>, <code>DBPointer<\/code>, <code>Undefined<\/code>, <code>MinKey<\/code>, <code>MaxKey<\/code> gibi MongoDB&#8217;ye \u00f6zg\u00fc veri tiplerini do\u011frulamak i\u00e7in \u00e7ok \u00f6nemlidir.<\/p>\n<p>\u00d6rne\u011fin, bir <code>_id<\/code> alan\u0131n\u0131n <code>ObjectId<\/code> tipinde olmas\u0131n\u0131 sa\u011flamak i\u00e7in <code>type: \"object\"<\/code> yerine <code>bsonType: \"objectId\"<\/code> kullanmak daha do\u011fru ve spesifiktir.<\/p>\n<h3>Pratik Uygulamalar ve \u00d6rnekler<\/h3>\n<p>\u015eimdi, \u015fema do\u011frulaman\u0131n farkl\u0131 senaryolarda nas\u0131l kullan\u0131laca\u011f\u0131na dair pratik \u00f6rneklere g\u00f6z atal\u0131m.<\/p>\n<h4>Yeni Bir Koleksiyon Olu\u015ftururken \u015eema Tan\u0131mlama<\/h4>\n<p>Bir <code>kullanicilar<\/code> koleksiyonu olu\u015ftural\u0131m ve bu koleksiyondaki her kullan\u0131c\u0131n\u0131n <code>ad<\/code>, <code>soyad<\/code>, <code>email<\/code>, <code>yas<\/code> ve <code>kayitTarihi<\/code> gibi belirli alanlara sahip olmas\u0131n\u0131 sa\u011flayal\u0131m.<\/p>\n<pre><code class=\"language-javascript\">db.createCollection(\"kullanicilar\", {\n   validator: {\n      $jsonSchema: {\n         bsonType: \"object\",\n         required: [\"ad\", \"soyad\", \"email\", \"yas\", \"kayitTarihi\"],\n         properties: {\n            ad: {\n               bsonType: \"string\",\n               description: \"ad alan\u0131 bir string olmal\u0131 ve zorunludur\"\n            },\n            soyad: {\n               bsonType: \"string\",\n               description: \"soyad alan\u0131 bir string olmal\u0131 ve zorunludur\"\n            },\n            email: {\n               bsonType: \"string\",\n               pattern: \"^.+@.+\\\\..+$\",\n               description: \"email alan\u0131 ge\u00e7erli bir email format\u0131nda olmal\u0131 ve zorunludur\"\n            },\n            yas: {\n               bsonType: \"int\",\n               minimum: 18,\n               maximum: 120,\n               description: \"yas alan\u0131 bir integer olmal\u0131, 18 ile 120 aras\u0131nda olmal\u0131 ve zorunludur\"\n            },\n            kayitTarihi: {\n               bsonType: \"date\",\n               description: \"kayitTarihi alan\u0131 bir Date olmal\u0131 ve zorunludur\"\n            },\n            telefon: {\n               bsonType: \"string\",\n               minLength: 10,\n               maxLength: 15,\n               description: \"telefon alan\u0131 iste\u011fe ba\u011fl\u0131 bir string olmal\u0131, 10-15 karakter aras\u0131nda olmal\u0131\"\n            },\n            aktif: {\n               bsonType: \"boolean\",\n               description: \"aktif alan\u0131 iste\u011fe ba\u011fl\u0131 bir boolean olmal\u0131\",\n               default: true \/\/ Varsay\u0131lan de\u011fer, ancak \u015fema do\u011frulamas\u0131 bunu zorlamaz, uygulama katman\u0131 i\u00e7in bir nottur.\n            },\n            roller: {\n               bsonType: \"array\",\n               items: {\n                  bsonType: \"string\",\n                  enum: [\"admin\", \"editor\", \"viewer\"]\n               },\n               minItems: 1,\n               uniqueItems: true,\n               description: \"roller alan\u0131 bir dizi string olmal\u0131, en az 1 eleman\u0131 olmal\u0131, benzersiz ve belirli de\u011ferlerden olu\u015fmal\u0131\"\n            }\n         }\n      }\n   },\n   validationLevel: \"strict\",\n   validationAction: \"error\"\n});<\/code><\/pre>\n<p>Bu \u00f6rnekte:<br \/>\n*   <code>$jsonSchema<\/code> anahtar kelimesi, do\u011frulama kurallar\u0131n\u0131n JSON \u015eema format\u0131nda oldu\u011funu belirtir.<br \/>\n*   <code>bsonType: \"object\"<\/code> belgenin bir nesne olmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <code>required<\/code> dizisi, hangi alanlar\u0131n zorunlu oldu\u011funu belirtir.<br \/>\n*   <code>properties<\/code> nesnesi, her bir alan i\u00e7in ayr\u0131 ayr\u0131 do\u011frulama kurallar\u0131n\u0131 i\u00e7erir. <code>email<\/code> alan\u0131 i\u00e7in bir <code>pattern<\/code> (d\u00fczenli ifade) kullan\u0131larak ge\u00e7erli bir e-posta format\u0131 zorunlu k\u0131l\u0131nm\u0131\u015ft\u0131r. <code>yas<\/code> i\u00e7in <code>bsonType: \"int\"<\/code> ve <code>minimum<\/code>\/<code>maximum<\/code> de\u011ferleri belirlenmi\u015ftir. <code>roller<\/code> alan\u0131 i\u00e7in bir dizi (<code>array<\/code>) tan\u0131mlanm\u0131\u015f ve elemanlar\u0131n\u0131n <code>enum<\/code> ile belirli de\u011ferlerden biri olmas\u0131, <code>minItems<\/code> ile en az bir eleman i\u00e7ermesi ve <code>uniqueItems<\/code> ile elemanlar\u0131n benzersiz olmas\u0131 sa\u011flanm\u0131\u015ft\u0131r.<\/p>\n<p>\u015eimdi bu koleksiyona ge\u00e7erli ve ge\u00e7ersiz belgeler eklemeyi deneyelim:<\/p>\n<pre><code class=\"language-javascript\">\/\/ Ge\u00e7erli belge\ndb.kullanicilar.insertOne({\n   ad: \"Ahmet\",\n   soyad: \"Y\u0131lmaz\",\n   email: \"ahmet.yilmaz@example.com\",\n   yas: 30,\n   kayitTarihi: new Date(),\n   telefon: \"5551234567\",\n   aktif: true,\n   roller: [\"editor\"]\n}); \/\/ Ba\u015far\u0131l\u0131 olacakt\u0131r\n\n\/\/ Ge\u00e7ersiz belge - email format\u0131 yanl\u0131\u015f\ndb.kullanicilar.insertOne({\n   ad: \"Ay\u015fe\",\n   soyad: \"Demir\",\n   email: \"ayse.demir\", \/\/ Hatal\u0131 email\n   yas: 25,\n   kayitTarihi: new Date(),\n   roller: [\"viewer\"]\n});\n\/*\nHata: \"Document failed validation\"\n*\/\n\n\/\/ Ge\u00e7ersiz belge - zorunlu alan eksik (yas)\ndb.kullanicilar.insertOne({\n   ad: \"Mehmet\",\n   soyad: \"Can\",\n   email: \"mehmet.can@example.com\",\n   kayitTarihi: new Date(),\n   roller: [\"admin\"]\n});\n\/*\nHata: \"Document failed validation\"\n*\/\n\n\/\/ Ge\u00e7ersiz belge - yas aral\u0131k d\u0131\u015f\u0131nda\ndb.kullanicilar.insertOne({\n   ad: \"Zeynep\",\n   soyad: \"Kaya\",\n   email: \"zeynep.kaya@example.com\",\n   yas: 15, \/\/ 18'den k\u00fc\u00e7\u00fck\n   kayitTarihi: new Date(),\n   roller: [\"viewer\"]\n});\n\/*\nHata: \"Document failed validation\"\n*\/\n\n\/\/ Ge\u00e7ersiz belge - roller dizisinde tekrarlayan eleman\ndb.kullanicilar.insertOne({\n   ad: \"Can\",\n   soyad: \"Kurt\",\n   email: \"can.kurt@example.com\",\n   yas: 40,\n   kayitTarihi: new Date(),\n   roller: [\"admin\", \"admin\"] \/\/ uniqueItems kural\u0131n\u0131 ihlal ediyor\n});\n\/*\nHata: \"Document failed validation\"\n*\/<\/code><\/pre>\n<h4>Mevcut Bir Koleksiyona \u015eema Ekleme veya G\u00fcncelleme<\/h4>\n<p>Diyelim ki <code>urunler<\/code> ad\u0131nda mevcut bir koleksiyonunuz var ve \u015fimdi bu koleksiyona \u015fema do\u011frulama eklemek istiyorsunuz. Veya mevcut bir \u015femay\u0131 g\u00fcncellemek istiyorsunuz. Bunun i\u00e7in <code>db.runCommand({ collMod: ... })<\/code> komutunu kullan\u0131r\u0131z.<\/p>\n<pre><code class=\"language-javascript\">\/\/ Mevcut bir 'urunler' koleksiyonuna \u015fema ekleme\ndb.runCommand({\n   collMod: \"urunler\",\n   validator: {\n      $jsonSchema: {\n         bsonType: \"object\",\n         required: [\"urunAdi\", \"fiyat\", \"stokAdedi\", \"kategori\"],\n         properties: {\n            urunAdi: {\n               bsonType: \"string\",\n               description: \"\u00dcr\u00fcn ad\u0131 bir string olmal\u0131 ve zorunludur\"\n            },\n            fiyat: {\n               bsonType: [\"double\", \"decimal\"], \/\/ double veya decimal olabilir\n               minimum: 0,\n               description: \"Fiyat s\u0131f\u0131rdan b\u00fcy\u00fck veya e\u015fit bir say\u0131 olmal\u0131 ve zorunludur\"\n            },\n            stokAdedi: {\n               bsonType: \"int\",\n               minimum: 0,\n               description: \"Stok adedi s\u0131f\u0131rdan b\u00fcy\u00fck veya e\u015fit bir tamsay\u0131 olmal\u0131 ve zorunludur\"\n            },\n            kategori: {\n               bsonType: \"string\",\n               enum: [\"Elektronik\", \"Giyim\", \"Ev Aletleri\", \"Kitap\"],\n               description: \"Kategori belirli de\u011ferlerden biri olmal\u0131 ve zorunludur\"\n            },\n            aciklama: {\n               bsonType: \"string\",\n               description: \"A\u00e7\u0131klama alan\u0131 iste\u011fe ba\u011fl\u0131 bir stringdir\"\n            }\n         }\n      }\n   },\n   validationLevel: \"strict\",\n   validationAction: \"error\"\n});<\/code><\/pre>\n<p>Bu komut, <code>urunler<\/code> koleksiyonuna belirtilen do\u011frulama kurallar\u0131n\u0131 uygular. E\u011fer koleksiyon zaten varsa, \u015fema g\u00fcncellenir. E\u011fer yoksa, bu komut hata verecektir, \u00e7\u00fcnk\u00fc <code>collMod<\/code> mevcut bir koleksiyon \u00fczerinde \u00e7al\u0131\u015f\u0131r.<\/p>\n<h4>Do\u011frulama Seviyeleri (<code>validationLevel<\/code>) ve Eylemleri (<code>validationAction<\/code>)<\/h4>\n<p><code>validationLevel<\/code> ve <code>validationAction<\/code> se\u00e7enekleri, \u015fema do\u011frulaman\u0131n davran\u0131\u015f\u0131n\u0131 ince ayarlaman\u0131za olanak tan\u0131r.<\/p>\n<p>*   <strong><code>validationLevel: \"moderate\"<\/code> Kullan\u0131m\u0131:<\/strong><br \/>\n    Diyelim ki <code>urunler<\/code> koleksiyonunuzda zaten \u015femaya uymayan eski belgeler var ve siz bu belgeleri etkilemeden yeni eklenen veya g\u00fcncellenen alanlar\u0131 do\u011frulamak istiyorsunuz. <code>moderate<\/code> seviyesi bu durumda faydal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-javascript\">db.runCommand({\n       collMod: \"urunler\",\n       validationLevel: \"moderate\", \/\/ Yaln\u0131zca \u015fema taraf\u0131ndan belirtilen alanlar\u0131 etkileyen g\u00fcncellemelerde do\u011frulama yapar\n       validationAction: \"error\"\n    });\n\n    \/\/ Eski bir belge (\u00f6rne\u011fin, kategori alan\u0131 yok)\n    db.urunler.insertOne({\n       urunAdi: \"Eski \u00dcr\u00fcn\",\n       fiyat: 99.99,\n       stokAdedi: 10\n    }); \/\/ Bu belge, 'moderate' seviyesinde yeni ekleme oldu\u011fu i\u00e7in hala hata verir (\u00e7\u00fcnk\u00fc 'kategori' zorunlu).\n        \/\/ E\u011fer 'validationLevel' 'moderate' iken, mevcut bir belgedeki 'kategori' alan\u0131 g\u00fcncellenirse, do\u011frulama \u00e7al\u0131\u015f\u0131r.\n        \/\/ Ama bir belgedeki 'a\u00e7\u0131klama' alan\u0131 g\u00fcncellenirse (ki bu \u015femada iste\u011fe ba\u011fl\u0131d\u0131r), do\u011frulama \u00e7al\u0131\u015fmaz.\n\n    \/\/ 'moderate' seviyesinde bir senaryo:\n    \/\/ Diyelim ki mevcut bir belgede 'urunAdi' alan\u0131 var ama 'fiyat' yoktu.\n    \/\/ \u015eema, 'fiyat'\u0131 zorunlu k\u0131l\u0131yor. E\u011fer bu belgeyi g\u00fcncellerken 'fiyat' eklemezsek, 'moderate' seviyesi hata verir.\n    \/\/ Ancak, \u015femada tan\u0131mlanmayan bir alan eklersek, 'moderate' seviyesi buna izin verir (e\u011fer additionalProperties true ise).<\/code><\/pre>\n<p>*   <strong><code>validationAction: \"warn\"<\/code> Kullan\u0131m\u0131:<\/strong><br \/>\n    \u015eema do\u011frulamay\u0131 test ederken veya veri kalitesini sadece izlemek istedi\u011finizde <code>warn<\/code> se\u00e7ene\u011fi kullan\u0131\u015fl\u0131d\u0131r. Do\u011frulama ba\u015far\u0131s\u0131z olsa bile i\u015flem devam eder, ancak bir uyar\u0131 logu olu\u015fturulur.<\/p>\n<pre><code class=\"language-javascript\">db.runCommand({\n       collMod: \"kullanicilar\",\n       validationLevel: \"strict\",\n       validationAction: \"warn\" \/\/ Do\u011frulama ba\u015far\u0131s\u0131z olursa sadece uyar\u0131 verilir\n    });\n\n    \/\/ Ge\u00e7ersiz belge - email format\u0131 yanl\u0131\u015f (\u015fimdi sadece uyar\u0131 verir, belge eklenir)\n    db.kullanicilar.insertOne({\n       ad: \"Deneme\",\n       soyad: \"Kullan\u0131c\u0131\",\n       email: \"gecersiz-email\",\n       yas: 20,\n       kayitTarihi: new Date(),\n       roller: [\"viewer\"]\n    });\n    \/\/ Bu i\u015flem ba\u015far\u0131l\u0131 olur, ancak MongoDB loglar\u0131nda bir uyar\u0131 mesaj\u0131 g\u00f6r\u00fcrs\u00fcn\u00fcz.<\/code><\/pre>\n<h4>Karma\u015f\u0131k \u015eema Kurallar\u0131 ve Mant\u0131ksal Operat\u00f6rler<\/h4>\n<p>Bazen bir belgenin yap\u0131s\u0131, ba\u015fka bir alan\u0131n de\u011ferine ba\u011fl\u0131 olarak de\u011fi\u015febilir. Bu t\u00fcr karma\u015f\u0131k kurallar\u0131 <code>allOf<\/code>, <code>anyOf<\/code>, <code>oneOf<\/code>, <code>not<\/code> gibi mant\u0131ksal operat\u00f6rlerle tan\u0131mlayabiliriz.<\/p>\n<p>\u00d6rne\u011fin, bir <code>siparisler<\/code> koleksiyonunda, <code>odemeTipi<\/code> alan\u0131na g\u00f6re farkl\u0131 alanlar\u0131n zorunlu olmas\u0131n\u0131 isteyelim:<br \/>\n*   E\u011fer <code>odemeTipi<\/code> &#8220;Kredi Kart\u0131&#8221; ise, <code>kartNumarasi<\/code> ve <code>sonKullanmaTarihi<\/code> zorunlu olmal\u0131.<br \/>\n*   E\u011fer <code>odemeTipi<\/code> &#8220;Banka Havalesi&#8221; ise, <code>bankaAdi<\/code> ve <code>iban<\/code> zorunlu olmal\u0131.<\/p>\n<pre><code class=\"language-javascript\">db.createCollection(\"siparisler\", {\n   validator: {\n      $jsonSchema: {\n         bsonType: \"object\",\n         required: [\"siparisNo\", \"toplamTutar\", \"odemeTipi\"],\n         properties: {\n            siparisNo: {\n               bsonType: \"string\",\n               description: \"Sipari\u015f numaras\u0131 zorunlu bir stringdir\"\n            },\n            toplamTutar: {\n               bsonType: [\"double\", \"decimal\"],\n               minimum: 0.01,\n               description: \"Toplam tutar s\u0131f\u0131rdan b\u00fcy\u00fck bir say\u0131 olmal\u0131\"\n            },\n            odemeTipi: {\n               bsonType: \"string\",\n               enum: [\"Kredi Kart\u0131\", \"Banka Havalesi\", \"Kap\u0131da \u00d6deme\"],\n               description: \"\u00d6deme tipi belirli de\u011ferlerden biri olmal\u0131\"\n            }\n         },\n         \/\/ 'odemeTipi' alan\u0131na g\u00f6re farkl\u0131 \u015femalar uygulayal\u0131m\n         oneOf: [\n            { \/\/ Kredi Kart\u0131 \u00f6demeleri i\u00e7in\n               properties: {\n                  odemeTipi: { enum: [\"Kredi Kart\u0131\"] },\n                  kartNumarasi: {\n                     bsonType: \"string\",\n                     pattern: \"^[0-9]{16}$\",\n                     description: \"Kredi kart\u0131 numaras\u0131 16 haneli bir say\u0131 olmal\u0131\"\n                  },\n                  sonKullanmaTarihi: {\n                     bsonType: \"string\",\n                     pattern: \"^(0[1-9]|1[0-2])\\\\\/[0-9]{2}$\", \/\/ MM\/YY format\u0131\n                     description: \"Son kullanma tarihi MM\/YY format\u0131nda olmal\u0131\"\n                  }\n               },\n               required: [\"kartNumarasi\", \"sonKullanmaTarihi\"]\n            },\n            { \/\/ Banka Havalesi \u00f6demeleri i\u00e7in\n               properties: {\n                  odemeTipi: { enum: [\"Banka Havalesi\"] },\n                  bankaAdi: {\n                     bsonType: \"string\",\n                     description: \"Banka ad\u0131 zorunlu bir stringdir\"\n                  },\n                  iban: {\n                     bsonType: \"string\",\n                     pattern: \"^TR[0-9]{24}$\", \/\/ T\u00fcrkiye IBAN format\u0131 i\u00e7in \u00f6rnek\n                     description: \"IBAN zorunlu bir stringdir\"\n                  }\n               },\n               required: [\"bankaAdi\", \"iban\"]\n            },\n            { \/\/ Kap\u0131da \u00d6deme i\u00e7in (ekstra alan yok)\n               properties: {\n                  odemeTipi: { enum: [\"Kap\u0131da \u00d6deme\"] }\n               }\n            }\n         ]\n      }\n   }\n});\n\n\/\/ Ge\u00e7erli Kredi Kart\u0131 sipari\u015fi\ndb.siparisler.insertOne({\n   siparisNo: \"S-001\",\n   toplamTutar: 150.75,\n   odemeTipi: \"Kredi Kart\u0131\",\n   kartNumarasi: \"1234567890123456\",\n   sonKullanmaTarihi: \"12\/25\"\n}); \/\/ Ba\u015far\u0131l\u0131\n\n\/\/ Ge\u00e7ersiz Kredi Kart\u0131 sipari\u015fi (kartNumarasi eksik)\ndb.siparisler.insertOne({\n   siparisNo: \"S-002\",\n   toplamTutar: 200.00,\n   odemeTipi: \"Kredi Kart\u0131\",\n   sonKullanmaTarihi: \"10\/24\"\n}); \/\/ Hata: 'kartNumarasi' zorunlu\n\n\/\/ Ge\u00e7erli Banka Havalesi sipari\u015fi\ndb.siparisler.insertOne({\n   siparisNo: \"S-003\",\n   toplamTutar: 500.00,\n   odemeTipi: \"Banka Havalesi\",\n   bankaAdi: \"Garanti BBVA\",\n   iban: \"TR123456789012345678901234\"\n}); \/\/ Ba\u015far\u0131l\u0131\n\n\/\/ Ge\u00e7ersiz Banka Havalesi sipari\u015fi (iban format\u0131 yanl\u0131\u015f)\ndb.siparisler.insertOne({\n   siparisNo: \"S-004\",\n   toplamTutar: 300.00,\n   odemeTipi: \"Banka Havalesi\",\n   bankaAdi: \"\u0130\u015f Bankas\u0131\",\n   iban: \"TR123\" \/\/ Hatal\u0131 IBAN\n}); \/\/ Hata: 'iban' pattern ihlali<\/code><\/pre>\n<p>Bu \u00f6rnek, <code>oneOf<\/code> operat\u00f6r\u00fcn\u00fcn g\u00fcc\u00fcn\u00fc g\u00f6sterir. Belge, <code>oneOf<\/code> i\u00e7indeki \u015femalardan yaln\u0131zca birine uymal\u0131d\u0131r.<\/p>\n<h4><code>bsonType<\/code> Kullan\u0131m\u0131<\/h4>\n<p>MongoDB&#8217;ye \u00f6zg\u00fc tiplerin do\u011frulanmas\u0131 i\u00e7in <code>bsonType<\/code> anahtar kelimesi hayati \u00f6neme sahiptir.<\/p>\n<pre><code class=\"language-javascript\">db.createCollection(\"finansalIslemler\", {\n   validator: {\n      $jsonSchema: {\n         bsonType: \"object\",\n         required: [\"_id\", \"tutar\", \"islemTarihi\", \"islemTipi\"],\n         properties: {\n            _id: {\n               bsonType: \"objectId\",\n               description: \"Belge ID'si bir ObjectId olmal\u0131\"\n            },\n            tutar: {\n               bsonType: \"decimal\", \/\/ Ondal\u0131kl\u0131 say\u0131lar i\u00e7in Decimal128 kullan\u0131yoruz\n               minimum: 0.01,\n               description: \"Tutar bir decimal olmal\u0131 ve 0.01'den b\u00fcy\u00fck olmal\u0131\"\n            },\n            islemTarihi: {\n               bsonType: \"date\",\n               description: \"\u0130\u015flem tarihi bir Date nesnesi olmal\u0131\"\n            },\n            islemTipi: {\n               bsonType: \"string\",\n               enum: [\"Gelir\", \"Gider\", \"Transfer\"],\n               description: \"\u0130\u015flem tipi belirli de\u011ferlerden biri olmal\u0131\"\n            },\n            detaylar: {\n               bsonType: \"string\",\n               description: \"\u0130\u015flem detaylar\u0131 iste\u011fe ba\u011fl\u0131 bir string olabilir\"\n            }\n         }\n      }\n   }\n});\n\n\/\/ Ge\u00e7erli i\u015flem\ndb.finansalIslemler.insertOne({\n   _id: new ObjectId(),\n   tutar: NumberDecimal(\"123.45\"), \/\/ Decimal128 kullan\u0131m\u0131\n   islemTarihi: new Date(),\n   islemTipi: \"Gelir\"\n}); \/\/ Ba\u015far\u0131l\u0131\n\n\/\/ Ge\u00e7ersiz i\u015flem - tutar yanl\u0131\u015f tipte (double yerine decimal bekleniyor)\ndb.finansalIslemler.insertOne({\n   _id: new ObjectId(),\n   tutar: 123.45, \/\/ Bu bir double'd\u0131r, Decimal128 de\u011fil\n   islemTarihi: new Date(),\n   islemTipi: \"Gider\"\n});\n\/*\nHata: \"Document failed validation\"\n*\/\n\n\/\/ Ge\u00e7ersiz i\u015flem - _id yanl\u0131\u015f tipte (string yerine objectId bekleniyor)\ndb.finansalIslemler.insertOne({\n   _id: \"some_string_id\",\n   tutar: NumberDecimal(\"50.00\"),\n   islemTarihi: new Date(),\n   islemTipi: \"Transfer\"\n});\n\/*\nHata: \"Document failed validation\"\n*\/<\/code><\/pre>\n<p>Bu \u00f6rnekte <code>NumberDecimal()<\/code> ile <code>Decimal128<\/code> tipinde bir de\u011fer olu\u015fturuldu\u011funu ve <code>ObjectId()<\/code> ile bir <code>ObjectId<\/code> olu\u015fturuldu\u011funu g\u00f6rebilirsiniz. Bu, MongoDB&#8217;ye \u00f6zg\u00fc veri tiplerini do\u011fru bir \u015fekilde kullanmak i\u00e7in \u00f6nemlidir.<\/p>\n<h3>\u015eema Do\u011frulama Y\u00f6netimi ve \u0130zleme<\/h3>\n<p>\u015eema do\u011frulama kurallar\u0131n\u0131 tan\u0131mlamak kadar, bunlar\u0131 y\u00f6netmek ve izlemek de \u00f6nemlidir.<\/p>\n<h4>Mevcut \u015eemay\u0131 G\u00f6r\u00fcnt\u00fcleme<\/h4>\n<p>Bir koleksiyonun mevcut do\u011frulama kurallar\u0131n\u0131 g\u00f6rmek i\u00e7in <code>db.getCollectionInfos()<\/code> veya <code>db.getCollection(\"koleksiyonAdi\").validator<\/code> kullanabilirsiniz:<\/p>\n<pre><code class=\"language-javascript\">\/\/ T\u00fcm koleksiyonlar\u0131n bilgilerini ve varsa validator'lar\u0131n\u0131 g\u00f6sterir\ndb.getCollectionInfos({ name: \"kullanicilar\" });\n\n\/\/ Sadece belirli bir koleksiyonun validator'\u0131n\u0131 g\u00f6sterir\ndb.getCollection(\"kullanicilar\").getValidator();<\/code><\/pre>\n<h4>\u015eemay\u0131 Devre D\u0131\u015f\u0131 B\u0131rakma veya Kald\u0131rma<\/h4>\n<p>Ge\u00e7ici olarak do\u011frulamay\u0131 devre d\u0131\u015f\u0131 b\u0131rakmak veya tamamen kald\u0131rmak isteyebilirsiniz:<\/p>\n<p>*   <strong>Do\u011frulamay\u0131 Devre D\u0131\u015f\u0131 B\u0131rakma:<\/strong><\/p>\n<pre><code class=\"language-javascript\">db.runCommand({\n       collMod: \"kullanicilar\",\n       validationLevel: \"off\"\n    });<\/code><\/pre>\n<p>*   <strong>\u015eemay\u0131 Tamamen Kald\u0131rma:<\/strong><\/p>\n<pre><code class=\"language-javascript\">db.runCommand({\n       collMod: \"kullanicilar\",\n       validator: {}, \/\/ Bo\u015f bir validator nesnesi ile \u015fema kald\u0131r\u0131l\u0131r\n       validationLevel: \"off\" \/\/ Do\u011frulamay\u0131 da kapatmak iyi bir pratiktir\n    });<\/code><\/pre>\n<p>    <code>validator: {}<\/code> kullanmak, koleksiyon \u00fczerindeki t\u00fcm do\u011frulama kurallar\u0131n\u0131 kald\u0131r\u0131r.<\/p>\n<h4>Do\u011frulama Hatalar\u0131n\u0131 Yakalama<\/h4>\n<p>Uygulama katman\u0131nda, MongoDB&#8217;den gelen do\u011frulama hatalar\u0131n\u0131 yakalamak ve kullan\u0131c\u0131ya anlaml\u0131 geri bildirimler sunmak \u00f6nemlidir. MongoDB, do\u011frulama hatas\u0131 durumunda bir <code>WriteError<\/code> veya <code>BulkWriteError<\/code> d\u00f6nd\u00fcr\u00fcr.<\/p>\n<pre><code class=\"language-javascript\">try {\n   db.kullanicilar.insertOne({\n      ad: \"Hatal\u0131\",\n      soyad: \"Giri\u015f\",\n      email: \"gecersiz\", \/\/ Hatal\u0131 email\n      yas: 10, \/\/ Hatal\u0131 ya\u015f\n      kayitTarihi: new Date(),\n      roller: [\"misafir\"]\n   });\n} catch (e) {\n   if (e.code === 121) { \/\/ 121 kodu do\u011frulama hatas\u0131n\u0131 temsil eder\n      print(\"Do\u011frulama hatas\u0131 olu\u015ftu: \" + e.message);\n      \/\/ Hata mesaj\u0131n\u0131 ayr\u0131\u015ft\u0131rarak daha spesifik bilgi verebilirsiniz\n   } else {\n      print(\"Beklenmedik bir hata olu\u015ftu: \" + e.message);\n   }\n}<\/code><\/pre>\n<p>Uygulama taraf\u0131nda bu hatalar\u0131 yakalayarak, kullan\u0131c\u0131ya hangi alanlar\u0131n yanl\u0131\u015f oldu\u011funu veya hangi kurallar\u0131n ihlal edildi\u011fini belirten \u00f6zel mesajlar g\u00f6sterebilirsiniz.<\/p>\n<h3>\u015eema Do\u011frulaman\u0131n S\u0131n\u0131rlamalar\u0131 ve Dikkat Edilmesi Gerekenler<\/h3>\n<p>\u015eema do\u011frulama g\u00fc\u00e7l\u00fc bir ara\u00e7 olsa da, baz\u0131 s\u0131n\u0131rlamalar\u0131 ve dikkat edilmesi gereken noktalar\u0131 vard\u0131r:<\/p>\n<p>*   <strong>Performans Etkisi:<\/strong> Her ekleme ve g\u00fcncelleme i\u015fleminde do\u011frulama kurallar\u0131 \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131 i\u00e7in k\u00fc\u00e7\u00fck bir performans maliyeti olabilir. Ancak modern sunucularda ve iyi tasarlanm\u0131\u015f \u015femalarda bu etki genellikle ihmal edilebilir d\u00fczeydedir.<br \/>\n*   <strong>Mevcut Veriler \u00dczerindeki Etki:<\/strong> \u015eema do\u011frulama, yaln\u0131zca yeni eklenen veya g\u00fcncellenen belgeler \u00fczerinde etkilidir. Koleksiyonunuzda zaten \u015femaya uymayan mevcut belgeler varsa, bu belgeler do\u011frulama kurallar\u0131ndan etkilenmez ve oldu\u011fu gibi kal\u0131r. Bu t\u00fcr verileri temizlemek veya d\u00fczeltmek i\u00e7in ayr\u0131 bir i\u015flem (\u00f6rne\u011fin, toplu g\u00fcncelleme) yapman\u0131z gerekebilir.<br \/>\n*   <strong>\u015eema Evrimi:<\/strong> Uygulama gereksinimleri geli\u015ftik\u00e7e, \u015fema do\u011frulama kurallar\u0131n\u0131z\u0131n da g\u00fcncellenmesi gerekebilir. Mevcut bir koleksiyonun \u015femas\u0131n\u0131 de\u011fi\u015ftirmek i\u00e7in <code>collMod<\/code> komutunu kullan\u0131rken dikkatli olun. B\u00fcy\u00fck de\u011fi\u015fiklikler yapmadan \u00f6nce test ortam\u0131nda denemeler yapmak \u00f6nemlidir.<br \/>\n*   <strong>\u0130ndeksleme ile Kar\u0131\u015ft\u0131rmay\u0131n:<\/strong> \u015eema do\u011frulama, veri kalitesini ve tutarl\u0131l\u0131\u011f\u0131n\u0131 sa\u011flamaya odaklan\u0131r. Veritaban\u0131 performans\u0131n\u0131 art\u0131rmak i\u00e7in indeksleme ve sorgu optimizasyonu gibi di\u011fer teknikleri kullanmaya devam etmelisiniz. \u015eema do\u011frulama, indekslerin yerini tutmaz.<br \/>\n*   <strong>Karma\u015f\u0131kl\u0131k:<\/strong> \u00c7ok karma\u015f\u0131k ve i\u00e7 i\u00e7e ge\u00e7mi\u015f \u015femalar, y\u00f6netimi ve hata ay\u0131klamay\u0131 zorla\u015ft\u0131rabilir. \u015eemalar\u0131n\u0131z\u0131 m\u00fcmk\u00fcn oldu\u011funca basit ve okunabilir tutmaya \u00e7al\u0131\u015f\u0131n.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>MongoDB&#8217;nin esnek \u015fema yap\u0131s\u0131, geli\u015ftiricilere b\u00fcy\u00fck bir \u00f6zg\u00fcrl\u00fck sunarken, \u015fema do\u011frulama \u00f6zelli\u011fi bu esnekli\u011fi veri tutarl\u0131l\u0131\u011f\u0131 ve kalitesiyle dengelemeye yard\u0131mc\u0131 olur. JSON \u015eema standartlar\u0131n\u0131 ve MongoDB&#8217;ye \u00f6zg\u00fc <code>bsonType<\/code> anahtar kelimesini kullanarak, koleksiyonlar\u0131n\u0131za g\u00fc\u00e7l\u00fc do\u011frulama kurallar\u0131 ekleyebilirsiniz.<\/p>\n<p>\u015eema do\u011frulama sayesinde, uygulaman\u0131z\u0131n veri katman\u0131nda beklenmeyen veri yap\u0131lar\u0131yla kar\u015f\u0131la\u015fma riskini azalt\u0131r, uygulama hatalar\u0131n\u0131 \u00f6nler ve veritaban\u0131n\u0131z\u0131n daha \u00f6ng\u00f6r\u00fclebilir ve y\u00f6netilebilir olmas\u0131n\u0131 sa\u011flars\u0131n\u0131z. \u00d6zellikle b\u00fcy\u00fck ekiplerin \u00e7al\u0131\u015ft\u0131\u011f\u0131 veya veri kalitesinin kritik oldu\u011fu projelerde \u015fema do\u011frulama, sa\u011flam ve g\u00fcvenilir MongoDB uygulamalar\u0131 geli\u015ftirmenin vazge\u00e7ilmez bir par\u00e7as\u0131d\u0131r. Do\u011frulama seviyeleri ve eylemleri gibi se\u00e7eneklerle, bu \u00f6zelli\u011fi projenizin \u00f6zel ihtiya\u00e7lar\u0131na g\u00f6re uyarlayabilir ve a\u015famal\u0131 olarak uygulayabilirsiniz. MongoDB&#8217;de \u015fema do\u011frulama kullanmak, veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc sa\u011flaman\u0131n ve uygulama g\u00fcvenilirli\u011fini art\u0131rman\u0131n en etkili yollar\u0131ndan biridir.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"MongoDB&#8217;de \u015eema Do\u011frulama (Schema Validation) Nas\u0131l Kullan\u0131l\u0131r?\nMongoDB, esnek ve \u015femas\u0131z (schema-less) yap\u0131s\u0131yla bilinir. Bu \u00f6zellik, geli","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[676],"tags":[],"class_list":{"0":"post-32081","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-mongodb","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>MongoDB&#039;de \u015eema Do\u011frulama (Schema Validation) Nas\u0131l Kullan\u0131l\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/mongodbde-sema-dogrulama-schema-validation-nasil-kullanilir\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"MongoDB&#039;de \u015eema Do\u011frulama (Schema Validation) Nas\u0131l Kullan\u0131l\u0131r?\" \/>\n<meta property=\"og:description\" content=\"MongoDB&#039;de \u015eema Do\u011frulama (Schema Validation) Nas\u0131l Kullan\u0131l\u0131r? MongoDB, esnek ve \u015femas\u0131z (schema-less) yap\u0131s\u0131yla bilinir. Bu \u00f6zellik, geli\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/mongodbde-sema-dogrulama-schema-validation-nasil-kullanilir\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-17T10:41:14+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mongodbde-sema-dogrulama-schema-validation-nasil-kullanilir\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mongodbde-sema-dogrulama-schema-validation-nasil-kullanilir\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"MongoDB&#8217;de \u015eema Do\u011frulama (Schema Validation) Nas\u0131l Kullan\u0131l\u0131r?\",\"datePublished\":\"2025-10-17T10:41:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mongodbde-sema-dogrulama-schema-validation-nasil-kullanilir\/\"},\"wordCount\":2179,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"MongoDB\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/mongodbde-sema-dogrulama-schema-validation-nasil-kullanilir\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mongodbde-sema-dogrulama-schema-validation-nasil-kullanilir\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/mongodbde-sema-dogrulama-schema-validation-nasil-kullanilir\/\",\"name\":\"MongoDB'de \u015eema Do\u011frulama (Schema Validation) Nas\u0131l Kullan\u0131l\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-17T10:41:14+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mongodbde-sema-dogrulama-schema-validation-nasil-kullanilir\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/mongodbde-sema-dogrulama-schema-validation-nasil-kullanilir\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mongodbde-sema-dogrulama-schema-validation-nasil-kullanilir\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"MongoDB&#8217;de \u015eema Do\u011frulama (Schema Validation) Nas\u0131l Kullan\u0131l\u0131r?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"MongoDB'de \u015eema Do\u011frulama (Schema Validation) Nas\u0131l Kullan\u0131l\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/mongodbde-sema-dogrulama-schema-validation-nasil-kullanilir\/","og_locale":"tr_TR","og_type":"article","og_title":"MongoDB'de \u015eema Do\u011frulama (Schema Validation) Nas\u0131l Kullan\u0131l\u0131r?","og_description":"MongoDB'de \u015eema Do\u011frulama (Schema Validation) Nas\u0131l Kullan\u0131l\u0131r? MongoDB, esnek ve \u015femas\u0131z (schema-less) yap\u0131s\u0131yla bilinir. Bu \u00f6zellik, geli","og_url":"https:\/\/fatihsoysal.com\/blog\/mongodbde-sema-dogrulama-schema-validation-nasil-kullanilir\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-17T10:41:14+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/mongodbde-sema-dogrulama-schema-validation-nasil-kullanilir\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/mongodbde-sema-dogrulama-schema-validation-nasil-kullanilir\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"MongoDB&#8217;de \u015eema Do\u011frulama (Schema Validation) Nas\u0131l Kullan\u0131l\u0131r?","datePublished":"2025-10-17T10:41:14+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/mongodbde-sema-dogrulama-schema-validation-nasil-kullanilir\/"},"wordCount":2179,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["MongoDB"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/mongodbde-sema-dogrulama-schema-validation-nasil-kullanilir\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/mongodbde-sema-dogrulama-schema-validation-nasil-kullanilir\/","url":"https:\/\/fatihsoysal.com\/blog\/mongodbde-sema-dogrulama-schema-validation-nasil-kullanilir\/","name":"MongoDB'de \u015eema Do\u011frulama (Schema Validation) Nas\u0131l Kullan\u0131l\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-17T10:41:14+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/mongodbde-sema-dogrulama-schema-validation-nasil-kullanilir\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/mongodbde-sema-dogrulama-schema-validation-nasil-kullanilir\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/mongodbde-sema-dogrulama-schema-validation-nasil-kullanilir\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"MongoDB&#8217;de \u015eema Do\u011frulama (Schema Validation) Nas\u0131l Kullan\u0131l\u0131r?"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32081","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=32081"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32081\/revisions"}],"predecessor-version":[{"id":32082,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32081\/revisions\/32082"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32081"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32081"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32081"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}