{"id":31344,"date":"2025-10-08T22:02:12","date_gmt":"2025-10-08T19:02:12","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/mongodb-crud-islemleri-universite-ogrenci-yonetim-sistemi\/"},"modified":"2025-10-08T22:02:12","modified_gmt":"2025-10-08T19:02:12","slug":"mongodb-crud-islemleri-universite-ogrenci-yonetim-sistemi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/mongodb-crud-islemleri-universite-ogrenci-yonetim-sistemi\/","title":{"rendered":"MongoDB CRUD \u0130\u015flemleri: \u00dcniversite \u00d6\u011frenci Y\u00f6netim Sistemi"},"content":{"rendered":"<p><body><\/p>\n<style>\n        body {\n            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n            line-height: 1.7;\n            color: #333;\n            max-width: 900px;\n            margin: 20px auto;\n            padding: 0 15px;\n            background-color: #f8f9fa;\n        }<\/p>\n<p>        h2, h3 {\n            color: #0056b3;\n            margin-top: 35px;\n            margin-bottom: 20px;\n            border-bottom: 2px solid #e9ecef;\n            padding-bottom: 10px;\n        }<\/p>\n<p>        h2 {\n            font-size: 2.2em;\n        }<\/p>\n<p>        h3 {\n            font-size: 1.7em;\n            color: #007bff;\n        }<\/p>\n<p>        p {\n            margin-bottom: 1em;\n            text-align: justify;\n        }<\/p>\n<p>        pre {\n            background-color: #e9ecef;\n            padding: 15px;\n            border-radius: 8px;\n            overflow-x: auto;\n            margin-bottom: 20px;\n        }<\/p>\n<p>        code {\n            font-family: 'Consolas', 'Monaco', monospace;\n            font-size: 0.9em;\n            color: #000;\n        }<\/p>\n<p>        .tip {\n            background-color: #d1ecf1;\n            border-left: 5px solid #0056b3;\n            padding: 15px 20px;\n            margin: 25px 0;\n            border-radius: 5px;\n            color: #0c5460;\n            font-weight: bold;\n        }<\/p>\n<p>        ul, ol {\n            margin-bottom: 1em;\n            padding-left: 25px;\n        }<\/p>\n<p>        li {\n            margin-bottom: 0.5em;\n        }<\/p>\n<p>        table {\n            width: 100%;\n            border-collapse: collapse;\n            margin: 25px 0;\n            font-size: 0.9em;\n            text-align: left;\n        }<\/p>\n<p>        th, td {\n            padding: 12px 15px;\n            border: 1px solid #ddd;\n        }<\/p>\n<p>        th {\n            background-color: #007bff;\n            color: white;\n            font-weight: bold;\n        }<\/p>\n<p>        tr:nth-child(even) {\n            background-color: #f2f2f2;\n        }<\/p>\n<p>        tr:hover {\n            background-color: #e2e6ea;\n        }<\/p>\n<p>        .faq-section {\n            background-color: #ffffff;\n            border: 1px solid #dee2e6;\n            border-radius: 8px;\n            padding: 20px;\n            margin-top: 40px;\n        }<\/p>\n<p>        .faq-question {\n            font-weight: bold;\n            color: #0056b3;\n            margin-bottom: 5px;\n        }<\/p>\n<p>        .faq-answer {\n            margin-bottom: 15px;\n            padding-left: 15px;\n            border-left: 3px solid #007bff;\n        }<\/p>\n<p>        @media (max-width: 768px) {\n            body {\n                margin: 15px;\n            }\n            h2 {\n                font-size: 1.8em;\n            }\n            h3 {\n                font-size: 1.4em;\n            }\n            table, thead, tbody, th, td, tr {\n                display: block;\n            }\n            thead tr {\n                position: absolute;\n                top: -9999px;\n                left: -9999px;\n            }\n            tr {\n                border: 1px solid #ccc;\n                margin-bottom: 10px;\n            }\n            td {\n                border: none;\n                border-bottom: 1px solid #eee;\n                position: relative;\n                padding-left: 50%;\n                text-align: right;\n            }\n            td:before {\n                position: absolute;\n                top: 6px;\n                left: 6px;\n                width: 45%;\n                padding-right: 10px;\n                white-space: nowrap;\n                text-align: left;\n                font-weight: bold;\n                color: #0056b3;\n            }\n            td:nth-of-type(1):before { content: \"\u00d6zellik\"; }\n            td:nth-of-type(2):before { content: \"A\u00e7\u0131klama\"; }\n        }\n    <\/style>\n<p>G\u00fcn\u00fcm\u00fcz dijital d\u00fcnyas\u0131nda, ister basit bir web uygulamas\u0131 isterse karma\u015f\u0131k bir kurumsal sistem olsun, her yaz\u0131l\u0131m\u0131n temelinde veri y\u00f6netimi yatar. Peki, bu verileri nas\u0131l olu\u015fturur, okur, g\u00fcnceller ve sileriz? \u0130\u015fte bu sorunun cevab\u0131, modern veri taban\u0131 y\u00f6netiminin kalbi olan CRUD (Create, Read, Update, Delete) i\u015flemlerinde gizlidir. Bu makalede, \u00f6zellikle esnek yap\u0131s\u0131yla dikkat \u00e7eken NoSQL veritaban\u0131 <strong>MongoDB<\/strong> \u00fczerinde, bir \u00fcniversite \u00f6\u011frenci y\u00f6netim sistemi \u00f6rne\u011fi \u00fczerinden CRUD i\u015flemlerini ad\u0131m ad\u0131m, uygulamal\u0131 bir \u015fekilde ke\u015ffedece\u011fiz. Bu rehber sayesinde MongoDB ile veri manip\u00fclasyonunun inceliklerini s\u0131f\u0131rdan \u00f6\u011frenerek projelerinizde rahatl\u0131kla uygulayabileceksiniz.<\/p>\n<p>Veri tabanlar\u0131, modern uygulamalar\u0131n bel kemi\u011fini olu\u015fturur ve bunlar\u0131n etkin bir \u015fekilde y\u00f6netilmesi, yaz\u0131l\u0131mlar\u0131n performans\u0131, g\u00fcvenilirli\u011fi ve \u00f6l\u00e7eklenebilirli\u011fi i\u00e7in hayati \u00f6nem ta\u015f\u0131r. CRUD k\u0131saltmas\u0131, bir veri taban\u0131ndaki temel etkile\u015fimleri ifade eder: Yeni kay\u0131tlar <strong>Olu\u015fturma (Create)<\/strong>, mevcut kay\u0131tlar\u0131 <strong>Okuma (Read)<\/strong>, bilgileri <strong>G\u00fcncelleme (Update)<\/strong> ve eski veya gereksiz kay\u0131tlar\u0131 <strong>Silme (Delete)<\/strong>. Bu d\u00f6rt temel i\u015flem, bir kullan\u0131c\u0131n\u0131n bir uygulamayla ger\u00e7ekle\u015ftirdi\u011fi hemen hemen her etkile\u015fimi kapsar. \u00d6rne\u011fin, bir \u00f6\u011frencinin sisteme kaydolmas\u0131 &#8216;Create&#8217;, notlar\u0131n\u0131 kontrol etmesi &#8216;Read&#8217;, adres bilgilerini g\u00fcncellemesi &#8216;Update&#8217; ve kayd\u0131n\u0131 sildirmesi &#8216;Delete&#8217; i\u015flemine kar\u015f\u0131l\u0131k gelir. Dolay\u0131s\u0131yla, bu i\u015flemlere hakim olmak, herhangi bir geli\u015ftiricinin veri taban\u0131yla etkili bir \u015fekilde \u00e7al\u0131\u015fabilmesi i\u00e7in ka\u00e7\u0131n\u0131lmaz bir gerekliliktir. MongoDB gibi NoSQL veritabanlar\u0131, bu i\u015flemleri belge tabanl\u0131, esnek ve y\u00fcksek performansl\u0131 bir yakla\u015f\u0131mla ele alarak geli\u015ftiricilere b\u00fcy\u00fck kolayl\u0131klar sa\u011flar. \u00dcniversite \u00f6\u011frenci y\u00f6netim sistemi gibi bir senaryo, bu CRUD i\u015flemlerinin ger\u00e7ek d\u00fcnya kullan\u0131m\u0131n\u0131 anlamak i\u00e7in m\u00fckemmel bir \u00f6rnek te\u015fkil eder.<\/p>\n<h2>MongoDB ve Belge Tabanl\u0131 Veritaban\u0131 Yakla\u015f\u0131m\u0131 Nedir?<\/h2>\n<p>Geleneksel ili\u015fkisel veri tabanlar\u0131n\u0131n aksine (\u00f6rne\u011fin MySQL, PostgreSQL), <strong>MongoDB<\/strong>, NoSQL ailesine ait, belge tabanl\u0131 (document-oriented) bir veri taban\u0131d\u0131r. Bu ne anlama geliyor? \u015e\u00f6yle d\u00fc\u015f\u00fcn\u00fcn: \u0130li\u015fkisel veri tabanlar\u0131 veriyi kat\u0131, \u00f6nceden tan\u0131mlanm\u0131\u015f tablolar ve sat\u0131rlar halinde saklarken, MongoDB veriyi esnek JSON benzeri belgeler (BSON format\u0131nda) halinde depolar. Her belge, bir nesne gibi d\u00fc\u015f\u00fcnebilirsiniz ve farkl\u0131 alanlara sahip olabilir. Bu esneklik, \u00f6zellikle h\u0131zl\u0131 de\u011fi\u015fen ve karma\u015f\u0131k veri yap\u0131lar\u0131na sahip uygulamalar i\u00e7in muazzam bir avantaj sunar.<\/p>\n<p>MongoDB&#8217;nin temel \u00f6zellikleri ve terminolojisi \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Belge (Document):<\/strong> MongoDB&#8217;deki temel veri birimidir. Alan ve de\u011fer \u00e7iftlerinden olu\u015fan JSON benzeri yap\u0131lard\u0131r. \u00d6rne\u011fin, bir \u00f6\u011frenci belgesi <code>{ \"_id\": ObjectId(\"...\"), \"ad\": \"Ali\", \"soyad\": \"Y\u0131lmaz\", \"numara\": \"12345\", \"bolum\": \"Bilgisayar M\u00fchendisli\u011fi\" }<\/code> \u015feklinde olabilir.<\/li>\n<li><strong>Koleksiyon (Collection):<\/strong> Belgelerin grupland\u0131\u011f\u0131 yerdir. \u0130li\u015fkisel veri tabanlar\u0131ndaki tablolara benzer, ancak bir koleksiyondaki belgeler farkl\u0131 \u015femalara sahip olabilir (\u015femas\u0131z yap\u0131). \u00d6rne\u011fin, &#8216;ogrenciler&#8217; ad\u0131nda bir koleksiyonumuz olabilir.<\/li>\n<li><strong>Veritaban\u0131 (Database):<\/strong> Koleksiyonlar\u0131n mant\u0131ksal bir k\u00fcmesidir. Bir MongoDB sunucusu birden fazla veritaban\u0131 bar\u0131nd\u0131rabilir.<\/li>\n<li><strong>Esnek \u015eema (Flexible Schema):<\/strong> Belki de en b\u00fcy\u00fck farklardan biri budur. MongoDB&#8217;de bir koleksiyondaki her belge ayn\u0131 alanlara sahip olmak zorunda de\u011fildir. Bu durum, veri modelinizi zaman i\u00e7inde kolayca evrimle\u015ftirmenize olanak tan\u0131r.<\/li>\n<li><strong>Y\u00fcksek Performans ve \u00d6l\u00e7eklenebilirlik:<\/strong> B\u00fcy\u00fck veri k\u00fcmeleri ve y\u00fcksek trafikli uygulamalar i\u00e7in tasarlanm\u0131\u015ft\u0131r. Yatay \u00f6l\u00e7eklenebilirlik (sharding) sayesinde veri taban\u0131n\u0131z\u0131 birden fazla sunucuya yayarak performans\u0131 art\u0131rabilirsiniz.<\/li>\n<\/ul>\n<h3>\u00d6\u011frenci Y\u00f6netim Sistemi \u0130\u00e7in Basit Bir \u015eema Nas\u0131l Tasarlan\u0131r?<\/h3>\n<p>\u00dcniversite \u00f6\u011frenci y\u00f6netim sistemi \u00f6rne\u011fimiz i\u00e7in olduk\u00e7a basit ama i\u015flevsel bir \u00f6\u011frenci \u015femas\u0131 tasarlayaca\u011f\u0131z. Bu \u015fema, \u00f6\u011frencilerin temel bilgilerini ve ald\u0131klar\u0131 dersleri i\u00e7erecek. Esnek \u015fema yap\u0131s\u0131 sayesinde, ilerleyen zamanlarda \u00f6\u011frenci belgelerine kolayca yeni alanlar ekleyebilece\u011fimizi unutmayal\u0131m.<\/p>\n<pre><code class=\"language-json\">\n{\n  \"_id\": ObjectId(\"...\"), \/\/ Her belge i\u00e7in benzersiz ID, MongoDB taraf\u0131ndan otomatik atan\u0131r\n  \"ogrenciNumarasi\": \"2023001\",\n  \"ad\": \"Elif\",\n  \"soyad\": \"Demir\",\n  \"bolum\": \"Yaz\u0131l\u0131m M\u00fchendisli\u011fi\",\n  \"email\": \"elif.demir@universite.edu.tr\",\n  \"dogumTarihi\": ISODate(\"2000-05-15T00:00:00Z\"),\n  \"notOrtalamasi\": 3.75,\n  \"aktif\": true,\n  \"aldigiDersler\": [\n    { \"kod\": \"YS101\", \"ad\": \"Veri Yap\u0131lar\u0131\", \"kredi\": 4 },\n    { \"kod\": \"YS102\", \"ad\": \"Algoritma Analizi\", \"kredi\": 3 }\n  ],\n  \"kayitTarihi\": ISODate(\"2023-09-01T10:00:00Z\")\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnek belge, bir \u00f6\u011frencinin temel bilgilerini, derslerini ve di\u011fer \u00f6nemli detaylar\u0131 bar\u0131nd\u0131r\u0131yor. G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, <code>aldigiDersler<\/code> alan\u0131 bir dizi (array) ve her dizi eleman\u0131 da kendi i\u00e7inde birer belge (nested document) i\u00e7eriyor. Bu yap\u0131, ili\u015fkisel veri tabanlar\u0131nda birden \u00e7ok tablo ve join i\u015flemi gerektirecekken, MongoDB'de tek bir belge i\u00e7inde kolayca modellenebilir.<\/p>\n<div class=\"tip\">\n        Uzman \u0130pucu: MongoDB'de veri modellemesi yaparken, \"embedded documents\" (i\u00e7 i\u00e7e belgeler) ve \"references\" (referanslar) aras\u0131nda se\u00e7im yapman\u0131z gerekir. Genellikle, bir veri di\u011ferine s\u0131k\u0131ca ba\u011fl\u0131ysa ve birlikte sorgulan\u0131yorsa embedded documents tercih edilir. E\u011fer veriler birbirinden ba\u011f\u0131ms\u0131z sorgulan\u0131yor veya \u00e7ok b\u00fcy\u00fckse, referanslar daha uygun olabilir. \u00d6\u011frencinin ald\u0131\u011f\u0131 dersler, \u00f6\u011frenciye s\u0131k\u0131ca ba\u011fl\u0131 oldu\u011fu i\u00e7in embedded documents kullan\u0131m\u0131 mant\u0131kl\u0131d\u0131r.\n    <\/div>\n<h2>\u00d6\u011frenci Verilerini MongoDB'ye Nas\u0131l Ekleriz? (Create \u0130\u015flemi)<\/h2>\n<p>Veri taban\u0131na yeni kay\u0131tlar eklemek, yani \"Create\" i\u015flemi, CRUD operasyonlar\u0131n\u0131n ilk ve en temel ad\u0131m\u0131d\u0131r. MongoDB'de bu i\u015flemi ger\u00e7ekle\u015ftirmek i\u00e7in genellikle <code>insertOne()<\/code> ve <code>insertMany()<\/code> metotlar\u0131n\u0131 kullan\u0131r\u0131z. Bu metotlar, bir veya birden fazla belgeyi belirtilen bir koleksiyona eklememizi sa\u011flar. \u015eimdi bu i\u015flemleri \u00fcniversite \u00f6\u011frenci y\u00f6netim sistemi \u00f6rne\u011fi \u00fczerinden detayl\u0131ca inceleyelim.<\/p>\n<h3>Tek Bir \u00d6\u011frenci Kayd\u0131 Nas\u0131l Olu\u015fturulur? (insertOne)<\/h3>\n<p>Sisteme yeni bir \u00f6\u011frencinin kayd\u0131n\u0131 yapmak istedi\u011fimizde, <code>insertOne()<\/code> metodu imdad\u0131m\u0131za yeti\u015fir. Bu metot, tek bir belge (JSON nesnesi) al\u0131r ve onu hedef koleksiyona ekler. MongoDB, eklenen her belgeye otomatik olarak benzersiz bir <code>_id<\/code> alan\u0131 atar. E\u011fer belge i\u00e7inde manuel olarak bir <code>_id<\/code> belirtmezsek, bu ID otomatik olarak olu\u015fturulur.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ Node.js ve MongoDB Driver kullanarak \u00f6rnek\nconst { MongoClient } = require('mongodb');\n\nasync function createOneStudent() {\n  const uri = \"mongodb:\/\/localhost:27017\"; \/\/ MongoDB ba\u011flant\u0131 URI'si\n  const client = new MongoClient(uri);\n\n  try {\n    await client.connect();\n    const database = client.db(\"universiteDB\"); \/\/ universiteDB veritaban\u0131\n    const ogrenciler = database.collection(\"ogrenciler\"); \/\/ ogrenciler koleksiyonu\n\n    const yeniOgrenci = {\n      ogrenciNumarasi: \"2023005\",\n      ad: \"Ay\u015fe\",\n      soyad: \"Y\u0131ld\u0131z\",\n      bolum: \"Pazarlama\",\n      email: \"ayse.yildiz@universite.edu.tr\",\n      dogumTarihi: new Date(\"2001-11-20\"),\n      notOrtalamasi: 3.20,\n      aktif: true,\n      aldigiDersler: [\n        { kod: \"PZ101\", ad: \"Pazarlamaya Giri\u015f\", kredi: 3 }\n      ],\n      kayitTarihi: new Date()\n    };\n\n    const result = await ogrenciler.insertOne(yeniOgrenci);\n    console.log(<code>Yeni \u00f6\u011frenci eklendi: ID - ${result.insertedId}<\/code>); \/\/ Yeni \u00f6\u011frencinin ID'si\n  } finally {\n    await client.close();\n  }\n}\n\ncreateOneStudent();\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu kod blo\u011fu, <code>universiteDB<\/code> veri taban\u0131ndaki <code>ogrenciler<\/code> koleksiyonuna \"Ay\u015fe Y\u0131ld\u0131z\" adl\u0131 yeni bir \u00f6\u011frenci kayd\u0131 ekler. \u0130\u015flem ba\u015far\u0131l\u0131 oldu\u011funda, eklenen \u00f6\u011frencinin otomatik olarak olu\u015fturulan <code>_id<\/code> de\u011feri konsola yazd\u0131r\u0131l\u0131r. Bu y\u00f6ntem, tekil veri giri\u015fi gereken durumlarda olduk\u00e7a kullan\u0131\u015fl\u0131d\u0131r, \u00f6rne\u011fin bir \u00f6\u011frencinin kay\u0131t formunu doldurup g\u00f6nderdi\u011finde.<\/p>\n<h3>Birden Fazla \u00d6\u011frenci Kayd\u0131n\u0131 Ayn\u0131 Anda Nas\u0131l Yapar\u0131z? (insertMany)<\/h3>\n<p>Bazen birden fazla \u00f6\u011frenciyi ayn\u0131 anda veri taban\u0131na eklememiz gerekebilir, \u00f6rne\u011fin bir d\u00f6nem ba\u015f\u0131nda toplu \u00f6\u011frenci kay\u0131tlar\u0131 yap\u0131ld\u0131\u011f\u0131nda. Bu t\u00fcr durumlar i\u00e7in <code>insertMany()<\/code> metodu idealdir. Bu metot, belge nesnelerinden olu\u015fan bir dizi al\u0131r ve t\u00fcm\u00fcn\u00fc tek bir i\u015flemde koleksiyona ekler.<\/p>\n<pre><code class=\"language-javascript\">\nconst { MongoClient } = require('mongodb');\n\nasync function createManyStudents() {\n  const uri = \"mongodb:\/\/localhost:27017\";\n  const client = new MongoClient(uri);\n\n  try {\n    await client.connect();\n    const database = client.db(\"universiteDB\");\n    const ogrenciler = database.collection(\"ogrenciler\");\n\n    const yeniOgrenciler = [\n      {\n        ogrenciNumarasi: \"2023006\",\n        ad: \"Burak\",\n        soyad: \"Can\",\n        bolum: \"\u0130leti\u015fim\",\n        email: \"burak.can@universite.edu.tr\",\n        dogumTarihi: new Date(\"2002-01-10\"),\n        notOrtalamasi: 2.90,\n        aktif: true,\n        aldigiDersler: [{ kod: \"\u0130L101\", ad: \"\u0130leti\u015fim Kuramlar\u0131\", kredi: 3 }],\n        kayitTarihi: new Date()\n      },\n      {\n        ogrenciNumarasi: \"2023007\",\n        ad: \"Zeynep\",\n        soyad: \"Kara\",\n        bolum: \"Hukuk\",\n        email: \"zeynep.kara@universite.edu.tr\",\n        dogumTarihi: new Date(\"2000-08-25\"),\n        notOrtalamasi: 3.50,\n        aktif: true,\n        aldigiDersler: [{ kod: \"HK101\", ad: \"Hukuka Giri\u015f\", kredi: 5 }],\n        kayitTarihi: new Date()\n      }\n    ];\n\n    const result = await ogrenciler.insertMany(yeniOgrenciler);\n    console.log(<code>${result.insertedCount} adet \u00f6\u011frenci ba\u015far\u0131yla eklendi.<\/code>);\n    console.log('Eklenen \u00f6\u011frenci ID\\'leri:', result.insertedIds);\n  } finally {\n    await client.close();\n  }\n}\n\ncreateManyStudents();\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, bir dizi i\u00e7inde iki yeni \u00f6\u011frenci belgesi tan\u0131mland\u0131 ve <code>insertMany()<\/code> ile tek seferde <code>ogrenciler<\/code> koleksiyonuna eklendi. \u0130\u015flem sonunda, ka\u00e7 \u00f6\u011frencinin eklendi\u011fini ve her birinin benzersiz <code>_id<\/code> de\u011ferlerini konsolda g\u00f6rebiliriz. Bu toplu ekleme operasyonu, \u00f6zellikle b\u00fcy\u00fck veri setlerinin aktar\u0131m\u0131 veya ilk kurulum a\u015famalar\u0131nda zaman tasarrufu sa\u011flar.<\/p>\n<div class=\"tip\">\n        Uzman \u0130pucu: <code>insertMany()<\/code> metoduna opsiyonel olarak <code>ordered: false<\/code> parametresi ge\u00e7ebilirsiniz. Bu, bir belgenin eklenmesi ba\u015far\u0131s\u0131z olsa bile di\u011fer belgelerin ekleme i\u015fleminin devam etmesini sa\u011flar. Varsay\u0131lan olarak <code>ordered: true<\/code>'dur, yani bir hata durumunda t\u00fcm i\u015flem durdurulur.\n    <\/div>\n<p>Create i\u015flemleri, bir veri taban\u0131n\u0131n hayat d\u00f6ng\u00fcs\u00fcndeki ilk ad\u0131md\u0131r. Do\u011fru ve verimli bir \u015fekilde yap\u0131ld\u0131\u011f\u0131nda, veri taban\u0131n\u0131z\u0131n sa\u011flam temeller \u00fczerine kurulmas\u0131n\u0131 sa\u011flar. \u015eimdi, ekledi\u011fimiz bu verilere nas\u0131l ula\u015faca\u011f\u0131m\u0131z\u0131 inceleyelim.<\/p>\n<h2>MongoDB'de \u00d6\u011frenci Bilgilerine Nas\u0131l Ula\u015f\u0131r\u0131z? (Read \u0130\u015flemi)<\/h2>\n<p>Veri taban\u0131na ekledi\u011fimiz bilgileri okumak, yani \"Read\" i\u015flemi, en s\u0131k kullan\u0131lan CRUD operasyonlar\u0131ndan biridir. \u00d6\u011frenci y\u00f6netim sisteminde, belirli bir \u00f6\u011frencinin bilgilerine ula\u015fmaktan, belirli kriterlere uyan t\u00fcm \u00f6\u011frencilerin listesini almaya kadar bir\u00e7ok senaryoda okuma i\u015flemleri yapar\u0131z. MongoDB, bu ihtiyac\u0131 kar\u015f\u0131lamak i\u00e7in g\u00fc\u00e7l\u00fc sorgu yetenekleri sunar ve <code>findOne()<\/code> ile <code>find()<\/code> metotlar\u0131 temel ara\u00e7lar\u0131m\u0131zd\u0131r.<\/p>\n<h3>Tek Bir \u00d6\u011frencinin Bilgilerini Nas\u0131l Getiririz? (findOne)<\/h3>\n<p>Belirli bir \u00f6\u011frencinin detaylar\u0131na, \u00f6rne\u011fin \u00f6\u011frenci numaras\u0131na g\u00f6re ula\u015fmak istedi\u011fimizde <code>findOne()<\/code> metodu kullan\u0131l\u0131r. Bu metot, sorgu kriterleriyle e\u015fle\u015fen ilk belgeyi d\u00f6nd\u00fcr\u00fcr. E\u011fer e\u015fle\u015fen bir belge bulunamazsa <code>null<\/code> d\u00f6ner.<\/p>\n<pre><code class=\"language-javascript\">\nconst { MongoClient } = require('mongodb');\n\nasync function readOneStudent() {\n  const uri = \"mongodb:\/\/localhost:27017\";\n  const client = new MongoClient(uri);\n\n  try {\n    await client.connect();\n    const database = client.db(\"universiteDB\");\n    const ogrenciler = database.collection(\"ogrenciler\");\n\n    \/\/ \u00d6\u011frenci numaras\u0131na g\u00f6re arama\n    const ogrenci = await ogrenciler.findOne({ ogrenciNumarasi: \"2023005\" });\n\n    if (ogrenci) {\n      console.log('Bulunan \u00d6\u011frenci:', ogrenci);\n    } else {\n      console.log('Belirtilen \u00f6\u011frenci numaras\u0131na sahip \u00f6\u011frenci bulunamad\u0131.');\n    }\n  } finally {\n    await client.close();\n  }\n}\n\nreadOneStudent();\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>ogrenciNumarasi: \"2023005\"<\/code> kriteriyle bir arama yap\u0131l\u0131yor. Bu, bir \u00f6\u011frencinin profil sayfas\u0131n\u0131 veya detaylar\u0131n\u0131 g\u00f6r\u00fcnt\u00fclemek i\u00e7in s\u0131k\u00e7a kullan\u0131lan bir senaryodur.<\/p>\n<h3>Belirli Kriterlere Uyan Birden Fazla \u00d6\u011frenciyi Nas\u0131l Listeleriz? (find)<\/h3>\n<p>Bir dersi alan t\u00fcm \u00f6\u011frencileri, belirli bir b\u00f6l\u00fcmdeki \u00f6\u011frencileri veya not ortalamas\u0131 belli bir de\u011ferin \u00fczerinde olan \u00f6\u011frencileri listelemek istedi\u011fimizde <code>find()<\/code> metodunu kullan\u0131r\u0131z. <code>find()<\/code>, sorgu kriterleriyle e\u015fle\u015fen t\u00fcm belgeleri i\u00e7eren bir Cursor (imle\u00e7) d\u00f6nd\u00fcr\u00fcr. Bu imle\u00e7 \u00fczerinde <code>toArray()<\/code> veya <code>forEach()<\/code> gibi metotlarla d\u00f6ng\u00fc yapabiliriz.<\/p>\n<pre><code class=\"language-javascript\">\nconst { MongoClient } = require('mongodb');\n\nasync function readManyStudents() {\n  const uri = \"mongodb:\/\/localhost:27017\";\n  const client = new MongoClient(uri);\n\n  try {\n    await client.connect();\n    const database = client.db(\"universiteDB\");\n    const ogrenciler = database.collection(\"ogrenciler\");\n\n    \/\/ Not ortalamas\u0131 3.0'\u0131n \u00fczerinde olan ve \"Yaz\u0131l\u0131m M\u00fchendisli\u011fi\" b\u00f6l\u00fcm\u00fcndeki \u00f6\u011frencileri listeleme\n    const query = {\n      notOrtalamasi: { $gt: 3.0 }, \/\/ greater than (b\u00fcy\u00fck)\n      bolum: \"Yaz\u0131l\u0131m M\u00fchendisli\u011fi\"\n    };\n\n    const ogrencilerListesi = await ogrenciler.find(query).toArray();\n\n    if (ogrencilerListesi.length > 0) {\n      console.log('Not ortalamas\u0131 3.0 \u00fczeri ve Yaz\u0131l\u0131m M\u00fchendisli\u011fi b\u00f6l\u00fcm\u00fcndeki \u00f6\u011frenciler:');\n      ogrencilerListesi.forEach(ogrenci => {\n        console.log(<code>- ${ogrenci.ad} ${ogrenci.soyad} (${ogrenci.ogrenciNumarasi}) - Not Ort: ${ogrenci.notOrtalamasi}<\/code>);\n      });\n    } else {\n      console.log('Belirtilen kriterlere uyan \u00f6\u011frenci bulunamad\u0131.');\n    }\n  } finally {\n    await client.close();\n  }\n}\n\nreadManyStudents();\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>$gt<\/code> (greater than) operat\u00f6r\u00fc kullan\u0131larak not ortalamas\u0131 3.0'dan b\u00fcy\u00fck olan \u00f6\u011frenciler filtreleniyor. Ayr\u0131ca, <code>bolum<\/code> alan\u0131 da sorguya dahil edilerek iki kriterin de kar\u015f\u0131lanmas\u0131 sa\u011flan\u0131yor. MongoDB'nin zengin <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/operator\/query\/\">sorgu operat\u00f6rleri<\/a> seti, \u00e7ok \u00e7e\u015fitli ve karma\u015f\u0131k sorgular\u0131 kolayca olu\u015fturman\u0131za olanak tan\u0131r:<\/p>\n<ul>\n<li><code>$eq<\/code>: E\u015fit (varsay\u0131lan)<\/li>\n<li><code>$ne<\/code>: E\u015fit de\u011fil<\/li>\n<li><code>$gt<\/code>: B\u00fcy\u00fckt\u00fcr<\/li>\n<li><code>$gte<\/code>: B\u00fcy\u00fck veya e\u015fittir<\/li>\n<li><code>$lt<\/code>: K\u00fc\u00e7\u00fckt\u00fcr<\/li>\n<li><code>$lte<\/code>: K\u00fc\u00e7\u00fck veya e\u015fittir<\/li>\n<li><code>$in<\/code>: Belirtilen dizideki de\u011ferlerden birine e\u015fittir<\/li>\n<li><code>$nin<\/code>: Belirtilen dizideki de\u011ferlerden hi\u00e7birine e\u015fit de\u011fildir<\/li>\n<li><code>$and<\/code>, <code>$or<\/code>, <code>$not<\/code>, <code>$nor<\/code>: Mant\u0131ksal operat\u00f6rler<\/li>\n<\/ul>\n<h3>Sorgu Sonu\u00e7lar\u0131n\u0131 \u00d6zelle\u015ftirme: Projektion ve S\u0131ralama<\/h3>\n<p>Bazen bir belgenin t\u00fcm alanlar\u0131na ihtiyac\u0131m\u0131z olmaz; sadece belirli bilgileri g\u00f6rmek isteyebiliriz. Bu durumda \"Projektion\" kullan\u0131r\u0131z. Ayr\u0131ca, sonu\u00e7lar\u0131 belirli bir alana g\u00f6re s\u0131ralamak (<code>sort()<\/code>) veya belirli bir say\u0131da sonu\u00e7la s\u0131n\u0131rlamak (<code>limit()<\/code>) da m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<pre><code class=\"language-javascript\">\nconst { MongoClient } = require('mongodb');\n\nasync function readProjectionAndSort() {\n  const uri = \"mongodb:\/\/localhost:27017\";\n  const client = new MongoClient(uri);\n\n  try {\n    await client.connect();\n    const database = client.db(\"universiteDB\");\n    const ogrenciler = database.collection(\"ogrenciler\");\n\n    \/\/ T\u00fcm \u00f6\u011frencileri not ortalamas\u0131na g\u00f6re azalan s\u0131rada listele, sadece ad, soyad ve not ortalamas\u0131 alanlar\u0131n\u0131 g\u00f6ster\n    const query = {}; \/\/ T\u00fcm belgeler\n    const projection = { ad: 1, soyad: 1, notOrtalamasi: 1, _id: 0 }; \/\/ 1: g\u00f6ster, 0: g\u00f6sterme\n    const sort = { notOrtalamasi: -1 }; \/\/ -1: azalan, 1: artan\n\n    const enBasariliOgrenciler = await ogrenciler.find(query)\n                                               .project(projection)\n                                               .sort(sort)\n                                               .limit(5) \/\/ \u0130lk 5 \u00f6\u011frenciyi g\u00f6ster\n                                               .toArray();\n\n    console.log('En Ba\u015far\u0131l\u0131 5 \u00d6\u011frenci (Not Ortalamas\u0131na G\u00f6re Azalan S\u0131ra):', enBasariliOgrenciler);\n  } finally {\n    await client.close();\n  }\n}\n\nreadProjectionAndSort();\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnek, t\u00fcm \u00f6\u011frencileri not ortalamalar\u0131na g\u00f6re azalan s\u0131rada s\u0131ralar ve yaln\u0131zca <code>ad<\/code>, <code>soyad<\/code> ve <code>notOrtalamasi<\/code> alanlar\u0131n\u0131 g\u00f6sterir (<code>_id<\/code> alan\u0131 hari\u00e7 tutulmu\u015ftur). Sonu\u00e7lar <code>limit(5)<\/code> ile ilk 5 \u00f6\u011frenciyle s\u0131n\u0131rland\u0131r\u0131l\u0131r. Bu t\u00fcr \u00f6zelle\u015ftirmeler, uygulaman\u0131z\u0131n performans\u0131n\u0131 art\u0131r\u0131r \u00e7\u00fcnk\u00fc veri taban\u0131ndan gereksiz veri transferi yapmas\u0131n\u0131 engeller.<\/p>\n<div class=\"tip\">\n        Uzman \u0130pucu: Sorgular\u0131n\u0131z\u0131 optimize etmek i\u00e7in do\u011fru indeksleme stratejileri kullanmak performans\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. S\u0131k\u00e7a sorgulad\u0131\u011f\u0131n\u0131z alanlara (\u00f6rne\u011fin <code>ogrenciNumarasi<\/code>, <code>bolum<\/code>, <code>notOrtalamasi<\/code>) indeks eklemeyi d\u00fc\u015f\u00fcnebilirsiniz.\n    <\/div>\n<p>Read i\u015flemleri, uygulamalar\u0131n kullan\u0131c\u0131ya bilgi sunmas\u0131n\u0131n temel yoludur. Etkili sorgular yazarak, kullan\u0131c\u0131lar\u0131n\u0131z\u0131n ihtiya\u00e7 duydu\u011fu verilere h\u0131zl\u0131 ve do\u011fru bir \u015fekilde ula\u015fmas\u0131n\u0131 sa\u011flayabilirsiniz.<\/p>\n<h2>Mevcut \u00d6\u011frenci Verilerini G\u00fcncelleme Sanat\u0131 (Update \u0130\u015flemi)<\/h2>\n<p>Veri taban\u0131ndaki mevcut bilgileri de\u011fi\u015ftirmek, yani \"Update\" i\u015flemi, bir uygulaman\u0131n dinamizmini sa\u011flayan kritik bir CRUD operasyonudur. \u00d6\u011frenci y\u00f6netim sistemimizde bir \u00f6\u011frencinin not ortalamas\u0131n\u0131n de\u011fi\u015fmesi, adres bilgisinin g\u00fcncellenmesi veya kay\u0131tl\u0131 derslerinin yenilenmesi gibi durumlar, g\u00fcncelleme i\u015flemlerini gerektirir. MongoDB, bu t\u00fcr senaryolar i\u00e7in \u00e7e\u015fitli ve esnek g\u00fcncelleme metotlar\u0131 ile operat\u00f6rleri sunar: <code>updateOne()<\/code>, <code>updateMany()<\/code> ve <code>replaceOne()<\/code>.<\/p>\n<h3>Tek Bir \u00d6\u011frenci Bilgisini Nas\u0131l G\u00fcncelleriz? (updateOne)<\/h3>\n<p>Belirli bir \u00f6\u011frencinin tek bir veya birden fazla alan\u0131n\u0131 g\u00fcncellemek istedi\u011fimizde <code>updateOne()<\/code> metodu kullan\u0131l\u0131r. Bu metot iki ana arg\u00fcman al\u0131r: birincisi, g\u00fcncellenecek belgeyi bulan sorgu filtresi; ikincisi ise, uygulanacak g\u00fcncelleme operasyonlar\u0131n\u0131 i\u00e7eren bir belge (genellikle <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/operator\/update\/\">g\u00fcncelleme operat\u00f6rleri<\/a> ile birlikte). \u00d6rne\u011fin, bir \u00f6\u011frencinin not ortalamas\u0131n\u0131 veya e-posta adresini de\u011fi\u015ftirebiliriz.<\/p>\n<pre><code class=\"language-javascript\">\nconst { MongoClient } = require('mongodb');\n\nasync function updateOneStudent() {\n  const uri = \"mongodb:\/\/localhost:27017\";\n  const client = new MongoClient(uri);\n\n  try {\n    await client.connect();\n    const database = client.db(\"universiteDB\");\n    const ogrenciler = database.collection(\"ogrenciler\");\n\n    const filter = { ogrenciNumarasi: \"2023005\" }; \/\/ G\u00fcncellenecek \u00f6\u011frenciyi bulan filtre\n    const updateDoc = {\n      $set: { \/\/ $set operat\u00f6r\u00fc, belirtilen alan\u0131n de\u011ferini ayarlar\n        notOrtalamasi: 3.85,\n        email: \"ayse.yildiz.yeni@universite.edu.tr\"\n      }\n    };\n\n    const result = await ogrenciler.updateOne(filter, updateDoc);\n    console.log(<code>${result.matchedCount} adet belge e\u015fle\u015fti, ${result.modifiedCount} adet belge g\u00fcncellendi.<\/code>);\n\n    if (result.modifiedCount > 0) {\n        console.log('\u00d6\u011frenci bilgileri ba\u015far\u0131yla g\u00fcncellendi.');\n    } else {\n        console.log('\u00d6\u011frenci bulunamad\u0131 veya bilgi de\u011fi\u015fmedi.');\n    }\n  } finally {\n    await client.close();\n  }\n}\n\nupdateOneStudent();\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, \"2023005\" numaral\u0131 \u00f6\u011frencinin <code>notOrtalamasi<\/code> ve <code>email<\/code> alanlar\u0131 <code>$set<\/code> operat\u00f6r\u00fc kullan\u0131larak g\u00fcncelleniyor. <code>$set<\/code>, bir alan\u0131n de\u011ferini ayarlamak veya mevcut olmayan bir alan\u0131 eklemek i\u00e7in en yayg\u0131n kullan\u0131lan operat\u00f6rd\u00fcr. <code>matchedCount<\/code> e\u015fle\u015fen belge say\u0131s\u0131n\u0131, <code>modifiedCount<\/code> ise ger\u00e7ekten g\u00fcncellenen belge say\u0131s\u0131n\u0131 g\u00f6sterir.<\/p>\n<h3>Birden Fazla \u00d6\u011frencinin Bilgilerini Toplu Nas\u0131l G\u00fcncelleriz? (updateMany)<\/h3>\n<p>Bazen birden fazla belgeyi ayn\u0131 anda g\u00fcncellememiz gerekebilir. \u00d6rne\u011fin, bir b\u00f6l\u00fcmdeki t\u00fcm \u00f6\u011frencilerin \"aktif\" durumunu de\u011fi\u015ftirmek veya belirli bir derste ba\u015far\u0131s\u0131z olan t\u00fcm \u00f6\u011frencilerin not ortalamas\u0131n\u0131 ayarlamak gibi. <code>updateMany()<\/code> metodu, sorgu filtresiyle e\u015fle\u015fen t\u00fcm belgeleri g\u00fcnceller.<\/p>\n<pre><code class=\"language-javascript\">\nconst { MongoClient } = require('mongodb');\n\nasync function updateManyStudents() {\n  const uri = \"mongodb:\/\/localhost:27017\";\n  const client = new MongoClient(uri);\n\n  try {\n    await client.connect();\n    const database = client.db(\"universiteDB\");\n    const ogrenciler = database.collection(\"ogrenciler\");\n\n    \/\/ T\u00fcm \"Pazarlama\" b\u00f6l\u00fcm\u00fc \u00f6\u011frencilerinin not ortalamas\u0131n\u0131 0.1 puan art\u0131rma\n    const filter = { bolum: \"Pazarlama\" };\n    const updateDoc = {\n      $inc: { \/\/ $inc operat\u00f6r\u00fc, bir say\u0131sal alan\u0131 belirli bir de\u011fer kadar art\u0131r\u0131r\/azalt\u0131r\n        notOrtalamasi: 0.1\n      }\n    };\n\n    const result = await ogrenciler.updateMany(filter, updateDoc);\n    console.log(<code>${result.matchedCount} adet belge e\u015fle\u015fti, ${result.modifiedCount} adet belge g\u00fcncellendi.<\/code>);\n\n    if (result.modifiedCount > 0) {\n        console.log('Pazarlama b\u00f6l\u00fcm\u00fcndeki \u00f6\u011frencilerin not ortalamalar\u0131 ba\u015far\u0131yla g\u00fcncellendi.');\n    } else {\n        console.log('Pazarlama b\u00f6l\u00fcm\u00fcnde \u00f6\u011frenci bulunamad\u0131 veya not ortalamalar\u0131 zaten en y\u00fcksek seviyede.');\n    }\n  } finally {\n    await client.close();\n  }\n}\n\nupdateManyStudents();\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu kod, <code>bolum: \"Pazarlama\"<\/code> kriterine uyan t\u00fcm \u00f6\u011frencilerin <code>notOrtalamasi<\/code> alan\u0131n\u0131 <code>$inc<\/code> operat\u00f6r\u00fc ile 0.1 puan art\u0131r\u0131r. <code>$inc<\/code>, say\u0131sal alanlar\u0131 atomik bir \u015fekilde (yani, ayn\u0131 anda ba\u015fka bir i\u015flem olsa bile do\u011fru sonucu garanti ederek) art\u0131rmak veya azaltmak i\u00e7in idealdir.<\/p>\n<h3>Bir Belgeyi Tamamen De\u011fi\u015ftirmek: replaceOne()<\/h3>\n<p>Bazen bir belgenin sadece birka\u00e7 alan\u0131n\u0131 g\u00fcncellemek yerine, onu tamamen yeni bir belgeyle de\u011fi\u015ftirmek isteyebiliriz. <code>replaceOne()<\/code> metodu bu i\u015f i\u00e7in kullan\u0131l\u0131r. Bu metot, sorgu filtresiyle e\u015fle\u015fen ilk belgeyi bulur ve onu sa\u011flanan yeni belgeyle de\u011fi\u015ftirir. Ancak <code>_id<\/code> alan\u0131 hari\u00e7, eski belgedeki t\u00fcm alanlar yenisiyle de\u011fi\u015fir. E\u011fer yeni belgede eski bir alan yoksa, o alan silinir; yeni bir alan varsa, o alan eklenir.<\/p>\n<pre><code class=\"language-javascript\">\nconst { MongoClient } = require('mongodb');\nconst { ObjectId } = require('mongodb'); \/\/ ObjectId'\u0131 import etmeyi unutmay\u0131n\n\nasync function replaceOneStudent() {\n  const uri = \"mongodb:\/\/localhost:27017\";\n  const client = new MongoClient(uri);\n\n  try {\n    await client.connect();\n    const database = client.db(\"universiteDB\");\n    const ogrenciler = database.collection(\"ogrenciler\");\n\n    \/\/ \u00d6rne\u011fin, belirli bir _id'ye sahip \u00f6\u011frenciyi tamamen farkl\u0131 bilgilerle de\u011fi\u015ftirme\n    \/\/ NOT: Ger\u00e7ek bir senaryoda _id'yi dinamik olarak alman\u0131z gerekir.\n    const filter = { _id: new ObjectId(\"65f9a7b3c6d7e8f9a0b1c2d3\") }; \/\/ Mevcut bir \u00f6\u011frencinin _id'si\n    const replacementDoc = {\n      ogrenciNumarasi: \"2023008\",\n      ad: \"Mehmet\",\n      soyad: \"Ak\",\n      bolum: \"Edebiyat\",\n      email: \"mehmet.ak@universite.edu.tr\",\n      dogumTarihi: new Date(\"2000-03-10\"),\n      notOrtalamasi: 2.50,\n      aktif: true,\n      aldigiDersler: [{ kod: \"ED101\", ad: \"T\u00fcrk Edebiyat\u0131\", kredi: 4 }],\n      kayitTarihi: new Date(\"2023-09-01T10:00:00Z\") \/\/ Mevcut bir tarihten farkl\u0131 olabilir\n    };\n\n    const result = await ogrenciler.replaceOne(filter, replacementDoc);\n    console.log(<code>${result.matchedCount} adet belge e\u015fle\u015fti, ${result.modifiedCount} adet belge de\u011fi\u015ftirildi.<\/code>);\n\n    if (result.modifiedCount > 0) {\n        console.log('\u00d6\u011frenci belgesi tamamen de\u011fi\u015ftirildi.');\n    } else {\n        console.log('\u00d6\u011frenci bulunamad\u0131 veya zaten ayn\u0131yd\u0131.');\n    }\n  } finally {\n    await client.close();\n  }\n}\n\n\/\/ replaceOneStudent(); \/\/ Bu fonksiyonu \u00e7al\u0131\u015ft\u0131rmadan \u00f6nce ge\u00e7erli bir ObjectId ile de\u011fi\u015ftirmeyi unutmay\u0131n!\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnek, belirli bir <code>_id<\/code>'ye sahip \u00f6\u011frenciyi <code>replacementDoc<\/code> ile tamamen de\u011fi\u015ftirir. Eski belgedeki <code>_id<\/code> korunur, ancak di\u011fer t\u00fcm alanlar yeni belgedeki de\u011ferlerle de\u011fi\u015fir. Bu metot, genellikle bir belgenin yap\u0131s\u0131 k\u00f6kten de\u011fi\u015fti\u011finde veya eski verilerin tamamen yeniyle de\u011fi\u015ftirilmesi gerekti\u011finde tercih edilir.<\/p>\n<div class=\"tip\">\n        Uzman \u0130pucu: G\u00fcncelleme operat\u00f6rleri (<code>$set<\/code>, <code>$inc<\/code>, <code>$push<\/code>, <code>$pull<\/code> vb.) verimli ve atomik i\u015flemler sa\u011flar. Bu operat\u00f6rleri kullanarak sadece ilgili alanlar\u0131 g\u00fcncelleyebilir, b\u00f6ylece veri tutarl\u0131l\u0131\u011f\u0131n\u0131 art\u0131rabilir ve performans\u0131 optimize edebilirsiniz. T\u00fcm belgeyi g\u00fcncellemek yerine (<code>replaceOne<\/code>), genellikle operat\u00f6rlerle par\u00e7a par\u00e7a g\u00fcncellemek (<code>updateOne<\/code>\/<code>updateMany<\/code>) daha iyi bir yakla\u015f\u0131md\u0131r.\n    <\/div>\n<p>G\u00fcncelleme i\u015flemleri, veri taban\u0131n\u0131z\u0131n canl\u0131 kalmas\u0131n\u0131 ve de\u011fi\u015fen ihtiya\u00e7lara adaptasyonunu sa\u011flar. Do\u011fru operat\u00f6rleri ve metotlar\u0131 se\u00e7erek, verilerinizi verimli ve g\u00fcvenli bir \u015fekilde y\u00f6netebilirsiniz.<\/p>\n<h2>Gereksiz \u00d6\u011frenci Kay\u0131tlar\u0131n\u0131 G\u00fcvenle Silme (Delete \u0130\u015flemi)<\/h2>\n<p>Veri taban\u0131ndaki gereksiz veya eski kay\u0131tlar\u0131 silmek, yani \"Delete\" i\u015flemi, CRUD operasyonlar\u0131n\u0131n son a\u015famas\u0131d\u0131r. \u00d6\u011frenci y\u00f6netim sisteminde, mezun olan \u00f6\u011frencilerin kay\u0131tlar\u0131n\u0131 ar\u015fivlemek veya kayd\u0131 iptal edilen \u00f6\u011frencilerin bilgilerini sistemden tamamen kald\u0131rmak gerekebilir. MongoDB, bu i\u015flemleri ger\u00e7ekle\u015ftirmek i\u00e7in <code>deleteOne()<\/code> ve <code>deleteMany()<\/code> metotlar\u0131n\u0131 sunar.<\/p>\n<h3>Tek Bir \u00d6\u011frenci Kayd\u0131n\u0131 Nas\u0131l Sileriz? (deleteOne)<\/h3>\n<p>Belirli bir \u00f6\u011frencinin kayd\u0131n\u0131 silmek istedi\u011fimizde <code>deleteOne()<\/code> metodu kullan\u0131l\u0131r. Bu metot, sorgu filtresiyle e\u015fle\u015fen *ilk* belgeyi siler. Bu genellikle, benzersiz bir tan\u0131mlay\u0131c\u0131 (\u00f6rne\u011fin <code>_id<\/code> veya <code>ogrenciNumarasi<\/code>) kullanarak belirli bir \u00f6\u011frenciyi hedefledi\u011fimizde tercih edilir.<\/p>\n<pre><code class=\"language-javascript\">\nconst { MongoClient } = require('mongodb');\n\nasync function deleteOneStudent() {\n  const uri = \"mongodb:\/\/localhost:27017\";\n  const client = new MongoClient(uri);\n\n  try {\n    await client.connect();\n    const database = client.db(\"universiteDB\");\n    const ogrenciler = database.collection(\"ogrenciler\");\n\n    const filter = { ogrenciNumarasi: \"2023007\" }; \/\/ Silinecek \u00f6\u011frenciyi bulan filtre\n\n    const result = await ogrenciler.deleteOne(filter);\n    console.log(<code>${result.deletedCount} adet belge silindi.<\/code>);\n\n    if (result.deletedCount > 0) {\n        console.log('\u00d6\u011frenci kayd\u0131 ba\u015far\u0131yla silindi.');\n    } else {\n        console.log('Belirtilen \u00f6\u011frenci numaras\u0131na sahip \u00f6\u011frenci bulunamad\u0131.');\n    }\n  } finally {\n    await client.close();\n  }\n}\n\ndeleteOneStudent();\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki kod, \"2023007\" numaral\u0131 \u00f6\u011frencinin kayd\u0131n\u0131 <code>ogrenciler<\/code> koleksiyonundan siler. <code>deletedCount<\/code> \u00f6zelli\u011fi, silinen belge say\u0131s\u0131n\u0131 g\u00f6sterir. Bu, genellikle bir kullan\u0131c\u0131n\u0131n kendi hesab\u0131n\u0131 kapatmas\u0131 veya y\u00f6neticinin tekil bir kayd\u0131 kald\u0131rmas\u0131 gibi durumlarda kullan\u0131l\u0131r.<\/p>\n<h3>Birden Fazla \u00d6\u011frenci Kayd\u0131n\u0131 Toplu Nas\u0131l Sileriz? (deleteMany)<\/h3>\n<p>Bazen belirli kriterlere uyan birden fazla \u00f6\u011frenci kayd\u0131n\u0131 ayn\u0131 anda silmemiz gerekebilir. \u00d6rne\u011fin, belirli bir tarihten \u00f6nce kay\u0131t olan ve art\u0131k aktif olmayan t\u00fcm mezun \u00f6\u011frencileri silmek gibi. <code>deleteMany()<\/code> metodu, sorgu filtresiyle e\u015fle\u015fen t\u00fcm belgeleri siler.<\/p>\n<pre><code class=\"language-javascript\">\nconst { MongoClient } = require('mongodb');\n\nasync function deleteManyStudents() {\n  const uri = \"mongodb:\/\/localhost:27017\";\n  const client = new MongoClient(uri);\n\n  try {\n    await client.connect();\n    const database = client.db(\"universiteDB\");\n    const ogrenciler = database.collection(\"ogrenciler\");\n\n    \/\/ Not ortalamas\u0131 2.0'\u0131n alt\u0131nda olan ve pasif durumdaki t\u00fcm \u00f6\u011frencileri silme\n    const filter = {\n      notOrtalamasi: { $lt: 2.0 },\n      aktif: false\n    };\n\n    const result = await ogrenciler.deleteMany(filter);\n    console.log(<code>${result.deletedCount} adet belge silindi.<\/code>);\n\n    if (result.deletedCount > 0) {\n        console.log('Kriterlere uyan \u00f6\u011frenciler ba\u015far\u0131yla silindi.');\n    } else {\n        console.log('Silinecek \u00f6\u011frenci bulunamad\u0131.');\n    }\n  } finally {\n    await client.close();\n  }\n}\n\n\/\/ deleteManyStudents(); \/\/ Bu fonksiyonu dikkatli kullan\u0131n, geri d\u00f6n\u00fc\u015f\u00fc yoktur!\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, not ortalamas\u0131 2.0'\u0131n alt\u0131nda olan ve <code>aktif: false<\/code> durumundaki t\u00fcm \u00f6\u011frencileri silen bir filtre tan\u0131mlan\u0131yor. <code>deleteMany()<\/code> bu kriterlere uyan t\u00fcm kay\u0131tlar\u0131 veri taban\u0131ndan kald\u0131r\u0131r. <strong>Uyar\u0131:<\/strong> <code>deleteMany()<\/code> ile yap\u0131lan i\u015flemler geri al\u0131namaz. Bu nedenle, filtreleme kriterlerinizi \u00e7ok dikkatli belirlemeniz kritik \u00f6nem ta\u015f\u0131r. Yanl\u0131\u015f bir filtre, istenmeyen veri kay\u0131plar\u0131na yol a\u00e7abilir.<\/p>\n<div class=\"tip\">\n        Uzman \u0130pucu: Veri silme i\u015flemleri geri d\u00f6nd\u00fcr\u00fclemez oldu\u011fundan, \u00fcretim ortamlar\u0131nda bu i\u015flemleri ger\u00e7ekle\u015ftirirken son derece dikkatli olun. Alternatif olarak, silmek yerine belgeleri \"pasif\" (<code>aktif: false<\/code>) olarak i\u015faretlemek veya ayr\u0131 bir \"ar\u015fiv\" koleksiyonuna ta\u015f\u0131mak gibi yumu\u015fak silme (soft delete) stratejileri kullanmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz. Bu, verileri gerekti\u011finde geri kurtarma esnekli\u011fi sa\u011flar.\n    <\/div>\n<p>Delete i\u015flemleri, veri taban\u0131n\u0131z\u0131n temiz ve y\u00f6netilebilir kalmas\u0131n\u0131 sa\u011flar. Ancak, bu i\u015flemlerin hassasiyeti g\u00f6z \u00f6n\u00fcne al\u0131nd\u0131\u011f\u0131nda, g\u00fcvenlik \u00f6nlemleri ve alternatif stratejiler her zaman ak\u0131lda tutulmal\u0131d\u0131r. \u015eimdi, bu CRUD i\u015flemlerini daha verimli hale getirmek i\u00e7in ileri d\u00fczey ipu\u00e7lar\u0131na ve mobil uyumluluk konusuna g\u00f6z atal\u0131m.<\/p>\n<h2>MongoDB Performans\u0131 \u0130\u00e7in \u0130leri D\u00fczey \u0130pu\u00e7lar\u0131 ve En \u0130yi Uygulamalar<\/h2>\n<p>CRUD operasyonlar\u0131n\u0131 \u00f6\u011frenmek, MongoDB ile \u00e7al\u0131\u015fman\u0131n ilk ad\u0131m\u0131d\u0131r. Ancak ger\u00e7ek d\u00fcnya uygulamalar\u0131nda, veritaban\u0131 performans\u0131n\u0131 optimize etmek ve g\u00fcvenli\u011fi sa\u011flamak b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r. \u0130\u015fte bu noktada ileri d\u00fczey ipu\u00e7lar\u0131 ve en iyi uygulamalar devreye girer. Bu b\u00f6l\u00fcmde, veritaban\u0131n\u0131z\u0131n daha h\u0131zl\u0131, daha g\u00fcvenli ve daha y\u00f6netilebilir olmas\u0131na yard\u0131mc\u0131 olacak baz\u0131 \u00f6nemli stratejilere de\u011finece\u011fiz.<\/p>\n<h3>\u0130ndeksleme Stratejileri: Sorgular\u0131 H\u0131zland\u0131rman\u0131n S\u0131rr\u0131<\/h3>\n<p>Bir kitapta belirli bir konuyu bulmak i\u00e7in fihrist kullanmak gibidir indeksleme. MongoDB'de indeksler, sorgular\u0131n h\u0131z\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Bir sorgu \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda, MongoDB t\u00fcm koleksiyonu taramak yerine (full table scan), indeksi kullanarak do\u011frudan e\u015fle\u015fen belgelere ula\u015fabilir. Bu, \u00f6zellikle b\u00fcy\u00fck koleksiyonlarda performans\u0131 katlar.<\/p>\n<ul>\n<li><strong>Tek Alan \u0130ndeksleri:<\/strong> S\u0131k\u00e7a sorgulad\u0131\u011f\u0131n\u0131z veya s\u0131ralad\u0131\u011f\u0131n\u0131z alanlar i\u00e7in olu\u015fturulur. \u00d6rne\u011fin, <code>ogrenciNumarasi<\/code> veya <code>bolum<\/code>.\n<pre><code class=\"language-javascript\">\nawait ogrenciler.createIndex({ ogrenciNumarasi: 1 }); \/\/ 1: artan s\u0131ra\nawait ogrenciler.createIndex({ bolum: 1 });\n            <\/pre>\n<p><\/code>\n        <\/li>\n<li><strong>Bile\u015fik \u0130ndeksler:<\/strong> Birden fazla alan \u00fczerinde sorgu yapt\u0131\u011f\u0131n\u0131zda faydal\u0131d\u0131r. \u0130ndeksleme s\u0131ras\u0131 \u00f6nemlidir. \u00d6rne\u011fin, hem b\u00f6l\u00fcm hem de not ortalamas\u0131na g\u00f6re sorgu yap\u0131yorsan\u0131z:\n<pre><code class=\"language-javascript\">\nawait ogrenciler.createIndex({ bolum: 1, notOrtalamasi: -1 }); \/\/ B\u00f6l\u00fcme g\u00f6re artan, not ortalamas\u0131na g\u00f6re azalan\n            <\/pre>\n<p><\/code>\n        <\/li>\n<li><strong>Benzersiz \u0130ndeksler (Unique Indexes):<\/strong> Belirli bir alan\u0131n de\u011ferinin koleksiyon i\u00e7inde benzersiz olmas\u0131n\u0131 sa\u011flar. \u00d6rne\u011fin, her \u00f6\u011frencinin sadece bir <code>ogrenciNumarasi<\/code> olmal\u0131:\n<pre><code class=\"language-javascript\">\nawait ogrenciler.createIndex({ ogrenciNumarasi: 1 }, { unique: true });\n            <\/pre>\n<p><\/code>\n        <\/li>\n<\/ul>\n<div class=\"tip\">\n        Uzman \u0130pucu: \u00c7ok fazla indeks olu\u015fturmak yazma (Create, Update, Delete) i\u015flemlerini yava\u015flatabilir \u00e7\u00fcnk\u00fc her yazma i\u015fleminde indekslerin de g\u00fcncellenmesi gerekir. Bu nedenle, yaln\u0131zca kritik sorgular i\u00e7in indeksler olu\u015fturmak ve indekslerin performans\u0131n\u0131 d\u00fczenli olarak izlemek \u00f6nemlidir. MongoDB'nin <code>explain()<\/code> metodunu kullanarak sorgular\u0131n\u0131z\u0131n indeksleri nas\u0131l kulland\u0131\u011f\u0131n\u0131 analiz edebilirsiniz.\n    <\/div>\n<h3>Veri Modellemesi: Embedded vs. Referans Yakla\u015f\u0131m\u0131<\/h3>\n<p>MongoDB'de veri modellemesi, uygulaman\u0131z\u0131n performans\u0131 ve esnekli\u011fi \u00fczerinde b\u00fcy\u00fck etkiye sahiptir. \u0130ki ana yakla\u015f\u0131m vard\u0131r:<\/p>\n<ol>\n<li><strong>Embedded Documents (\u0130\u00e7 \u0130\u00e7e Belgeler):<\/strong> \u0130lgili veriler tek bir belgede saklan\u0131r. Bu, okuma performans\u0131n\u0131 art\u0131r\u0131r \u00e7\u00fcnk\u00fc tek bir sorguyla t\u00fcm ilgili verilere ula\u015f\u0131l\u0131r (join'lere gerek kalmaz). \u00d6\u011frencinin ald\u0131\u011f\u0131 dersler veya adres bilgileri gibi, ana belgeye ait ve s\u0131k\u00e7a birlikte sorgulanan veriler i\u00e7in idealdir.\n<pre><code class=\"language-json\">\n\/\/ \u00d6\u011frencinin dersleri do\u011frudan belge i\u00e7inde\n{\n  \"ogrenciNumarasi\": \"2023001\",\n  \"ad\": \"Elif\",\n  \"aldigiDersler\": [\n    { \"kod\": \"YS101\", \"ad\": \"Veri Yap\u0131lar\u0131\" }\n  ]\n}\n            <\/pre>\n<p><\/code>\n        <\/li>\n<li><strong>References (Referanslar):<\/strong> Belgeler aras\u0131nda ba\u011flant\u0131 kurmak i\u00e7in bir belgede di\u011ferinin <code>_id<\/code>'si saklan\u0131r. Bu, belgeler birbirinden ba\u011f\u0131ms\u0131z sorguland\u0131\u011f\u0131nda, ili\u015fkisel veri tabanlar\u0131ndaki join'lere benzer i\u015flemler (ancak uygulama taraf\u0131nda yap\u0131l\u0131r) gerekti\u011finde veya i\u00e7 i\u00e7e veriler \u00e7ok b\u00fcy\u00fck oldu\u011funda kullan\u0131l\u0131r. \u00d6rne\u011fin, fak\u00fclte bilgisi ayr\u0131 bir koleksiyonda tutulabilir ve \u00f6\u011frenci belgesi sadece fak\u00fcltenin <code>_id<\/code>'sini i\u00e7erebilir.\n<pre><code class=\"language-json\">\n\/\/ \u00d6\u011frencinin fak\u00fclte bilgisi ba\u015fka bir koleksiyona referansla\n{\n  \"ogrenciNumarasi\": \"2023001\",\n  \"ad\": \"Elif\",\n  \"fakulteId\": ObjectId(\"...ID_OF_FACULTY...\")\n}\n            <\/pre>\n<p><\/code>\n        <\/li>\n<\/ol>\n<p>Do\u011fru modelleme, uygulaman\u0131z\u0131n veri eri\u015fim desenlerine g\u00f6re se\u00e7ilmelidir. Hem okuma hem de yazma maliyetlerini dengelemek \u00f6nemlidir.<\/p>\n<h3>Aggregasyon Framework'e K\u0131sa Bir Bak\u0131\u015f<\/h3>\n<p>Karma\u015f\u0131k veri analizi ve raporlama ihtiya\u00e7lar\u0131n\u0131z oldu\u011funda MongoDB'nin Aggregation Framework'\u00fc devreye girer. Bu g\u00fc\u00e7l\u00fc ara\u00e7, verileri d\u00f6n\u00fc\u015ft\u00fcrmenize, grupland\u0131rman\u0131za, filtrelemenize ve analiz etmenize olanak tan\u0131r. \u00d6rne\u011fin, bir b\u00f6l\u00fcmdeki \u00f6\u011frencilerin ortalama not ortalamas\u0131n\u0131 bulmak, en \u00e7ok ders alan \u00f6\u011frencileri listelemek gibi i\u015flemler bu framework ile kolayca yap\u0131labilir. Agrege pipe'lar\u0131, veriyi bir dizi i\u015flemden ge\u00e7irerek istedi\u011finiz sonuca ula\u015fman\u0131z\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ \u00d6rnek: Her b\u00f6l\u00fcmdeki \u00f6\u011frencilerin ortalama not ortalamas\u0131n\u0131 hesaplama\nawait ogrenciler.aggregate([\n  {\n    $group: {\n      _id: \"$bolum\", \/\/ B\u00f6l\u00fcme g\u00f6re grupla\n      ortalamaNot: { $avg: \"$notOrtalamasi\" }, \/\/ Not ortalamas\u0131n\u0131n ortalamas\u0131n\u0131 al\n      toplamOgrenci: { $sum: 1 } \/\/ Her b\u00f6l\u00fcmdeki \u00f6\u011frenci say\u0131s\u0131n\u0131 say\n    }\n  },\n  {\n    $sort: { ortalamaNot: -1 } \/\/ Ortalama nota g\u00f6re azalan s\u0131rada s\u0131rala\n  }\n]).toArray();\n    <\/pre>\n<p><\/code><\/p>\n<h3>G\u00fcvenlik \u00d6nerileri<\/h3>\n<p>Veri g\u00fcvenli\u011fi her zaman \u00f6ncelikli olmal\u0131d\u0131r:<\/p>\n<ul>\n<li><strong>Eri\u015fim Kontrol\u00fc (Authentication\/Authorization):<\/strong> Kullan\u0131c\u0131 ad\u0131\/\u015fifre veya sertifikalarla eri\u015fimi k\u0131s\u0131tlay\u0131n. Rol tabanl\u0131 eri\u015fim kontrol\u00fc (RBAC) kullanarak her kullan\u0131c\u0131n\u0131n sadece ihtiyac\u0131 olan verilere eri\u015fmesini sa\u011flay\u0131n.<\/li>\n<li><strong>\u015eifreleme (Encryption):<\/strong> Hassas verileri (\u00f6rne\u011fin e-posta, ki\u015fisel bilgiler) disk \u00fczerinde veya transfer s\u0131ras\u0131nda \u015fifreleyin (TLS\/SSL).<\/li>\n<li><strong>A\u011f G\u00fcvenli\u011fi:<\/strong> MongoDB sunucular\u0131n\u0131za yaln\u0131zca g\u00fcvenli a\u011flardan (VPN, \u00f6zel VPC'ler) eri\u015fime izin verin. Varsay\u0131lan portu de\u011fi\u015ftirmeyi ve g\u00fcvenlik duvar\u0131 kullanmay\u0131 unutmay\u0131n.<\/li>\n<li><strong>Yedekleme (Backups):<\/strong> Veri kayb\u0131n\u0131 \u00f6nlemek i\u00e7in d\u00fczenli ve otomatik yedeklemeler al\u0131n.<\/li>\n<\/ul>\n<h2>Mobil Uygulama Uyumlu Tasar\u0131m: Medya Sorgular\u0131 ile Ak\u0131ll\u0131 \u00c7\u00f6z\u00fcmler<\/h2>\n<p>G\u00fcn\u00fcm\u00fczde kullan\u0131c\u0131lar\u0131n b\u00fcy\u00fck bir k\u0131sm\u0131 web sitelerine ve uygulamalara mobil cihazlar \u00fczerinden eri\u015fiyor. Bu nedenle, haz\u0131rlad\u0131\u011f\u0131m\u0131z HTML i\u00e7eri\u011finin mobil cihazlarda da d\u00fczg\u00fcn ve kullan\u0131c\u0131 dostu g\u00f6r\u00fcnmesini sa\u011flamak kritik \u00f6neme sahiptir. Bu b\u00f6l\u00fcmde, CSS medya sorgular\u0131n\u0131 (Media Queries) kullanarak HTML i\u00e7eri\u011fimizi farkl\u0131 ekran boyutlar\u0131na nas\u0131l adapte edebilece\u011fimize dair \u00f6rnekler sunaca\u011f\u0131z.<\/p>\n<h3>CSS Medya Sorgular\u0131 Nas\u0131l Kullan\u0131l\u0131r?<\/h3>\n<p>Medya sorgular\u0131, CSS kurallar\u0131n\u0131 belirli ko\u015fullara (\u00f6rne\u011fin ekran geni\u015fli\u011fi, cihaz tipi) ba\u011fl\u0131 olarak uygulamam\u0131z\u0131 sa\u011flar. Bu sayede, farkl\u0131 cihazlarda farkl\u0131 stil tan\u0131mlar\u0131 yaparak responsive (duyarl\u0131) bir tasar\u0131m olu\u015fturabiliriz. En yayg\u0131n kullan\u0131m alan\u0131, ekran geni\u015fli\u011fine g\u00f6re elementlerin boyutunu, d\u00fczenini veya g\u00f6r\u00fcn\u00fcrl\u00fc\u011f\u00fcn\u00fc de\u011fi\u015ftirmektir.<\/p>\n<pre><code class=\"language-css\">\n\/* Genel stil tan\u0131mlar\u0131 (masa\u00fcst\u00fc i\u00e7in optimize edilmi\u015f olabilir) *\/\nbody {\n    font-size: 16px;\n    margin: 20px auto;\n    max-width: 900px;\n}\n\nh2 {\n    font-size: 2.2em;\n}\n\n\/* 768px veya daha k\u00fc\u00e7\u00fck ekranlar i\u00e7in stil kurallar\u0131 *\/\n@media (max-width: 768px) {\n    body {\n        margin: 15px; \/* Yan bo\u015fluklar\u0131 azalt *\/\n        max-width: 100%; \/* Tam geni\u015flik kullan *\/\n        font-size: 14px; \/* Yaz\u0131 tipini k\u00fc\u00e7\u00fclt *\/\n    }\n\n    h2 {\n        font-size: 1.8em; \/* Ba\u015fl\u0131k boyutunu k\u00fc\u00e7\u00fclt *\/\n    }\n\n    p {\n        text-align: left; \/* Mobil cihazlarda daha rahat okunabilir *\/\n    }\n\n    \/* Tablolar\u0131n mobil uyumlu hale getirilmesi \u00f6rne\u011fi *\/\n    table, thead, tbody, th, td, tr {\n        display: block; \/* T\u00fcm tablo elemanlar\u0131n\u0131 blok seviyesinde g\u00f6ster *\/\n    }\n\n    thead tr {\n        position: absolute; \/* Ba\u015fl\u0131k sat\u0131r\u0131n\u0131 gizle *\/\n        top: -9999px;\n        left: -9999px;\n    }\n\n    tr {\n        border: 1px solid #ccc;\n        margin-bottom: 10px;\n    }\n\n    td {\n        border: none; \/* Kenarl\u0131klar\u0131n\u0131 kald\u0131r *\/\n        border-bottom: 1px solid #eee; \/* Alt kenarl\u0131k ekle *\/\n        position: relative;\n        padding-left: 50%; \/* \u0130\u00e7eri\u011fi sa\u011fa kayd\u0131r *\/\n        text-align: right; \/* Metni sa\u011fa hizala *\/\n    }\n\n    td:before {\n        position: absolute;\n        top: 6px;\n        left: 6px;\n        width: 45%;\n        padding-right: 10px;\n        white-space: nowrap;\n        text-align: left;\n        font-weight: bold;\n        color: #0056b3;\n    }\n    \/* Her s\u00fctun i\u00e7in \u00f6zel ba\u015fl\u0131klar *\/\n    td:nth-of-type(1):before { content: \"\u00d6zellik\"; }\n    td:nth-of-type(2):before { content: \"A\u00e7\u0131klama\"; }\n}\n\n\/* 480px veya daha k\u00fc\u00e7\u00fck ekranlar i\u00e7in ek stil kurallar\u0131 (daha k\u00fc\u00e7\u00fck mobil cihazlar) *\/\n@media (max-width: 480px) {\n    h2 {\n        font-size: 1.5em;\n    }\n    .tip {\n        padding: 10px 15px;\n        font-size: 0.9em;\n    }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki CSS kodu, <code><\/p>\n<style><\/code> etiketi i\u00e7inde yer almaktad\u0131r ve makalenin ba\u015f\u0131nda eklenmi\u015ftir. Bu kod, <code>max-width: 768px<\/code> ve <code>max-width: 480px<\/code> gibi medya sorgular\u0131 kullanarak, ekran geni\u015fli\u011fi belirtilen de\u011ferlerin alt\u0131na d\u00fc\u015ft\u00fc\u011f\u00fcnde farkl\u0131 stil kurallar\u0131 uygular. \u00d6zellikle tablolar\u0131n mobil cihazlarda yatay kayd\u0131rma yerine dikey olarak okunabilir hale getirilmesi (stacked table) yayg\u0131n bir responsive tasar\u0131m tekni\u011fidir. Bu yakla\u015f\u0131m, kullan\u0131c\u0131lar\u0131n i\u00e7eri\u011fi herhangi bir cihazda rahat\u00e7a t\u00fcketmesini sa\u011flar.<\/p>\n<h2>Sonu\u00e7: MongoDB ile Veri Y\u00f6netiminde Ustala\u015fmak ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Bu kapsaml\u0131 makale boyunca, MongoDB'nin g\u00fcc\u00fcn\u00fc kullanarak bir \u00fcniversite \u00f6\u011frenci y\u00f6netim sisteminde temel CRUD i\u015flemlerini (Create, Read, Update, Delete) nas\u0131l ger\u00e7ekle\u015ftirece\u011fimizi ad\u0131m ad\u0131m \u00f6\u011frendik. Belge tabanl\u0131 mimarisi ve esnek \u015fema yap\u0131s\u0131 sayesinde MongoDB'nin modern uygulama geli\u015ftirme i\u00e7in ne kadar uygun oldu\u011funu ke\u015ffettik. \u00d6\u011frenci bilgilerini eklemekten (<code>insertOne<\/code>, <code>insertMany<\/code>), \u00e7e\u015fitli sorgu operat\u00f6rleriyle okumaya (<code>findOne<\/code>, <code>find<\/code>), mevcut verileri g\u00fcncellemekten (<code>updateOne<\/code>, <code>updateMany<\/code>, <code>replaceOne<\/code>) ve gereksiz kay\u0131tlar\u0131 g\u00fcvenle silmeye (<code>deleteOne<\/code>, <code>deleteMany<\/code>) kadar her bir operasyonu uygulamal\u0131 \u00f6rneklerle peki\u015ftirdik. Ayr\u0131ca, indeksleme stratejileri, veri modellemesi ve Aggregation Framework gibi ileri d\u00fczey konulara de\u011finerek performans optimizasyonu i\u00e7in kritik ipu\u00e7lar\u0131 verdik. Son olarak, medya sorgular\u0131 arac\u0131l\u0131\u011f\u0131yla i\u00e7eri\u011fimizin mobil cihazlarda da sorunsuz bir kullan\u0131c\u0131 deneyimi sunmas\u0131 i\u00e7in responsive tasar\u0131m\u0131n \u00f6nemini vurgulad\u0131k.<\/p>\n<p>MongoDB, b\u00fcy\u00fck ve karma\u015f\u0131k veri k\u00fcmelerini y\u00f6netmek, h\u0131zl\u0131 ve \u00f6l\u00e7eklenebilir uygulamalar geli\u015ftirmek i\u00e7in harika bir se\u00e7enektir. Bu makaledeki bilgilerle donanm\u0131\u015f olarak, art\u0131k kendi projelerinizde MongoDB'yi etkin bir \u015fekilde kullanmaya ba\u015flayabilir, daha dinamik ve veri odakl\u0131 uygulamalar yaratabilirsiniz. Unutmay\u0131n, pratik yapmak ve MongoDB'nin zengin d\u00f6k\u00fcmantasyonunu ke\u015ffetmek, bu alandaki ustal\u0131\u011f\u0131n\u0131z\u0131 geli\u015ftirmek i\u00e7in en iyi yoldur. Veri taban\u0131 y\u00f6netiminde yetkinlik kazanarak, yaz\u0131l\u0131m geli\u015ftirme yolculu\u011funuzda \u00f6nemli bir avantaj elde edeceksiniz.<\/p>\n<div class=\"faq-section\">\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<div class=\"faq-question\">1. MongoDB ili\u015fkisel veri tabanlar\u0131ndan neden farkl\u0131d\u0131r?<\/div>\n<div class=\"faq-answer\">MongoDB, belge tabanl\u0131 (NoSQL) bir veri taban\u0131d\u0131r ve veriyi JSON benzeri esnek belgeler halinde depolar. \u0130li\u015fkisel veri tabanlar\u0131 ise veriyi \u00f6nceden tan\u0131mlanm\u0131\u015f \u015femalara sahip tablolarda tutar. MongoDB, \u015fema esnekli\u011fi, yatay \u00f6l\u00e7eklenebilirlik ve y\u00fcksek performans sunarak \u00f6zellikle b\u00fcy\u00fck ve h\u0131zl\u0131 de\u011fi\u015fen veri yap\u0131lar\u0131na sahip uygulamalar i\u00e7in avantaj sa\u011flar.<\/div>\n<div class=\"faq-question\">2. Hangi durumda <code>updateOne()<\/code> yerine <code>replaceOne()<\/code> kullanmal\u0131y\u0131m?<\/div>\n<div class=\"faq-answer\"><code>updateOne()<\/code>, bir belgedeki belirli alanlar\u0131 de\u011fi\u015ftirmek veya eklemek i\u00e7in kullan\u0131l\u0131rken, <code>replaceOne()<\/code> bir belgenin <code>_id<\/code> alan\u0131 d\u0131\u015f\u0131ndaki t\u00fcm i\u00e7eri\u011fini tamamen yeni bir belgeyle de\u011fi\u015ftirir. E\u011fer belgenin yap\u0131s\u0131nda k\u00f6kl\u00fc bir de\u011fi\u015fiklik yap\u0131yor veya eski verilerin tamamen yenisiyle de\u011fi\u015ftirilmesi gerekiyorsa <code>replaceOne()<\/code> tercih edilir. Ancak genellikle, yaln\u0131zca ilgili alanlar\u0131 g\u00fcncelleyen <code>updateOne()<\/code> daha verimlidir.<\/div>\n<div class=\"faq-question\">3. MongoDB'de indeksleme neden \u00f6nemlidir ve ne zaman kullanmal\u0131y\u0131m?<\/div>\n<div class=\"faq-answer\">\u0130ndeksleme, sorgu performans\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131ran bir mekanizmad\u0131r. Veritaban\u0131n\u0131n t\u00fcm koleksiyonu taramak yerine, indeksi kullanarak sorgu kriterleriyle e\u015fle\u015fen belgelere do\u011frudan ula\u015fmas\u0131n\u0131 sa\u011flar. S\u0131k\u00e7a sorgulad\u0131\u011f\u0131n\u0131z, filtreledi\u011finiz veya s\u0131ralad\u0131\u011f\u0131n\u0131z alanlar i\u00e7in indeksler olu\u015fturmal\u0131s\u0131n\u0131z. Ancak, \u00e7ok fazla indeksin yazma (create, update, delete) i\u015flemlerini yava\u015flatabilece\u011fini unutmay\u0131n; bu nedenle dengeli bir yakla\u015f\u0131m benimsemek \u00f6nemlidir.<\/div>\n<div class=\"faq-question\">4. Bir \u00f6\u011frenci kayd\u0131n\u0131 tamamen silmek yerine \"yumu\u015fak silme\" (soft delete) ne anlama gelir?<\/div>\n<div class=\"faq-answer\">Yumu\u015fak silme, bir kayd\u0131 veri taban\u0131ndan fiziksel olarak silmek yerine, belgede <code>aktif: false<\/code> veya <code>silindiMi: true<\/code> gibi bir alan ekleyerek kayd\u0131 pasif hale getirmektir. Bu, kayd\u0131n art\u0131k uygulamada g\u00f6r\u00fcnmemesini sa\u011flar ancak veritaban\u0131nda saklan\u0131r. Avantaj\u0131, kayd\u0131n daha sonra geri al\u0131nabilmesi veya ar\u015fivleme amac\u0131yla tutulabilmesidir. \u00d6zellikle geri d\u00f6n\u00fc\u015f\u00fc olmayan silme i\u015flemlerinin riskli oldu\u011fu durumlarda tercih edilir.<\/div>\n<div class=\"faq-question\">5. Mobil uyumlu HTML i\u00e7in medya sorgular\u0131n\u0131 kullanman\u0131n temel faydas\u0131 nedir?<\/div>\n<div class=\"faq-answer\">Medya sorgular\u0131, web i\u00e7eri\u011finizin farkl\u0131 ekran boyutlar\u0131na ve cihazlara (masa\u00fcst\u00fc, tablet, telefon) otomatik olarak uyum sa\u011flamas\u0131na olanak tan\u0131r. Temel faydas\u0131, tek bir HTML kodu taban\u0131yla t\u00fcm cihazlarda tutarl\u0131 ve optimal bir kullan\u0131c\u0131 deneyimi sunmakt\u0131r. Bu, ayr\u0131 mobil siteler geli\u015ftirmeye gerek kalmadan geli\u015ftirme s\u00fcrecini basitle\u015ftirir ve SEO a\u00e7\u0131s\u0131ndan da faydal\u0131d\u0131r.<\/div>\n<\/p><\/div>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"G\u00fcn\u00fcm\u00fcz dijital d\u00fcnyas\u0131nda, ister basit bir web uygulamas\u0131 isterse karma\u015f\u0131k bir kurumsal sistem olsun, her yaz\u0131l\u0131m\u0131n temelinde veri&hellip;","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-31344","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 CRUD \u0130\u015flemleri: \u00dcniversite \u00d6\u011frenci Y\u00f6netim Sistemi<\/title>\n<meta name=\"description\" content=\"G\u00fcn\u00fcm\u00fcz dijital d\u00fcnyas\u0131nda, ister basit bir web uygulamas\u0131 isterse karma\u015f\u0131k bir kurumsal sistem olsun, her yaz\u0131l\u0131m\u0131n temelinde veri y\u00f6netimi yatar. Peki, bu verileri nas\u0131l olu\u015fturur, okur, g\u00fcnceller ve sileriz? \u0130\u015fte bu sorunun cevab\u0131, modern veri taban\u0131 y\u00f6netiminin kalbi olan CRUD (Create, Read, Update, Delete) i\u015flemlerinde gizlidir. Bu makalede, \u00f6zellikle esnek yap\u0131s\u0131yla dikkat \u00e7eken NoSQL veritaban\u0131 MongoDB \u00fczerinde, bir \u00fcniversite \u00f6\u011frenci y\u00f6netim sistemi \u00f6rne\u011fi \u00fczerinden CRUD i\u015flemlerini ad\u0131m ad\u0131m, uygulamal\u0131 bir \u015fekilde ke\u015ffedece\u011fiz. Bu rehber sayesinde MongoDB ile veri manip\u00fclasyonunun inceliklerini s\u0131f\u0131rdan \u00f6\u011frenerek projelerinizde rahatl\u0131kla uygulayabileceksiniz.\" \/>\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\/mongodb-crud-islemleri-universite-ogrenci-yonetim-sistemi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"MongoDB CRUD \u0130\u015flemleri: \u00dcniversite \u00d6\u011frenci Y\u00f6netim Sistemi\" \/>\n<meta property=\"og:description\" content=\"G\u00fcn\u00fcm\u00fcz dijital d\u00fcnyas\u0131nda, ister basit bir web uygulamas\u0131 isterse karma\u015f\u0131k bir kurumsal sistem olsun, her yaz\u0131l\u0131m\u0131n temelinde veri y\u00f6netimi yatar. Peki, bu verileri nas\u0131l olu\u015fturur, okur, g\u00fcnceller ve sileriz? \u0130\u015fte bu sorunun cevab\u0131, modern veri taban\u0131 y\u00f6netiminin kalbi olan CRUD (Create, Read, Update, Delete) i\u015flemlerinde gizlidir. Bu makalede, \u00f6zellikle esnek yap\u0131s\u0131yla dikkat \u00e7eken NoSQL veritaban\u0131 MongoDB \u00fczerinde, bir \u00fcniversite \u00f6\u011frenci y\u00f6netim sistemi \u00f6rne\u011fi \u00fczerinden CRUD i\u015flemlerini ad\u0131m ad\u0131m, uygulamal\u0131 bir \u015fekilde ke\u015ffedece\u011fiz. Bu rehber sayesinde MongoDB ile veri manip\u00fclasyonunun inceliklerini s\u0131f\u0131rdan \u00f6\u011frenerek projelerinizde rahatl\u0131kla uygulayabileceksiniz.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/mongodb-crud-islemleri-universite-ogrenci-yonetim-sistemi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-08T19:02:12+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=\"30 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mongodb-crud-islemleri-universite-ogrenci-yonetim-sistemi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mongodb-crud-islemleri-universite-ogrenci-yonetim-sistemi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"MongoDB CRUD \u0130\u015flemleri: \u00dcniversite \u00d6\u011frenci Y\u00f6netim Sistemi\",\"datePublished\":\"2025-10-08T19:02:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mongodb-crud-islemleri-universite-ogrenci-yonetim-sistemi\/\"},\"wordCount\":4239,\"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\/mongodb-crud-islemleri-universite-ogrenci-yonetim-sistemi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mongodb-crud-islemleri-universite-ogrenci-yonetim-sistemi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/mongodb-crud-islemleri-universite-ogrenci-yonetim-sistemi\/\",\"name\":\"MongoDB CRUD \u0130\u015flemleri: \u00dcniversite \u00d6\u011frenci Y\u00f6netim Sistemi\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-08T19:02:12+00:00\",\"description\":\"G\u00fcn\u00fcm\u00fcz dijital d\u00fcnyas\u0131nda, ister basit bir web uygulamas\u0131 isterse karma\u015f\u0131k bir kurumsal sistem olsun, her yaz\u0131l\u0131m\u0131n temelinde veri y\u00f6netimi yatar. Peki, bu verileri nas\u0131l olu\u015fturur, okur, g\u00fcnceller ve sileriz? \u0130\u015fte bu sorunun cevab\u0131, modern veri taban\u0131 y\u00f6netiminin kalbi olan CRUD (Create, Read, Update, Delete) i\u015flemlerinde gizlidir. Bu makalede, \u00f6zellikle esnek yap\u0131s\u0131yla dikkat \u00e7eken NoSQL veritaban\u0131 MongoDB \u00fczerinde, bir \u00fcniversite \u00f6\u011frenci y\u00f6netim sistemi \u00f6rne\u011fi \u00fczerinden CRUD i\u015flemlerini ad\u0131m ad\u0131m, uygulamal\u0131 bir \u015fekilde ke\u015ffedece\u011fiz. Bu rehber sayesinde MongoDB ile veri manip\u00fclasyonunun inceliklerini s\u0131f\u0131rdan \u00f6\u011frenerek projelerinizde rahatl\u0131kla uygulayabileceksiniz.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mongodb-crud-islemleri-universite-ogrenci-yonetim-sistemi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/mongodb-crud-islemleri-universite-ogrenci-yonetim-sistemi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mongodb-crud-islemleri-universite-ogrenci-yonetim-sistemi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"MongoDB CRUD \u0130\u015flemleri: \u00dcniversite \u00d6\u011frenci Y\u00f6netim Sistemi\"}]},{\"@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 CRUD \u0130\u015flemleri: \u00dcniversite \u00d6\u011frenci Y\u00f6netim Sistemi","description":"G\u00fcn\u00fcm\u00fcz dijital d\u00fcnyas\u0131nda, ister basit bir web uygulamas\u0131 isterse karma\u015f\u0131k bir kurumsal sistem olsun, her yaz\u0131l\u0131m\u0131n temelinde veri y\u00f6netimi yatar. Peki, bu verileri nas\u0131l olu\u015fturur, okur, g\u00fcnceller ve sileriz? \u0130\u015fte bu sorunun cevab\u0131, modern veri taban\u0131 y\u00f6netiminin kalbi olan CRUD (Create, Read, Update, Delete) i\u015flemlerinde gizlidir. Bu makalede, \u00f6zellikle esnek yap\u0131s\u0131yla dikkat \u00e7eken NoSQL veritaban\u0131 MongoDB \u00fczerinde, bir \u00fcniversite \u00f6\u011frenci y\u00f6netim sistemi \u00f6rne\u011fi \u00fczerinden CRUD i\u015flemlerini ad\u0131m ad\u0131m, uygulamal\u0131 bir \u015fekilde ke\u015ffedece\u011fiz. Bu rehber sayesinde MongoDB ile veri manip\u00fclasyonunun inceliklerini s\u0131f\u0131rdan \u00f6\u011frenerek projelerinizde rahatl\u0131kla uygulayabileceksiniz.","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\/mongodb-crud-islemleri-universite-ogrenci-yonetim-sistemi\/","og_locale":"tr_TR","og_type":"article","og_title":"MongoDB CRUD \u0130\u015flemleri: \u00dcniversite \u00d6\u011frenci Y\u00f6netim Sistemi","og_description":"G\u00fcn\u00fcm\u00fcz dijital d\u00fcnyas\u0131nda, ister basit bir web uygulamas\u0131 isterse karma\u015f\u0131k bir kurumsal sistem olsun, her yaz\u0131l\u0131m\u0131n temelinde veri y\u00f6netimi yatar. Peki, bu verileri nas\u0131l olu\u015fturur, okur, g\u00fcnceller ve sileriz? \u0130\u015fte bu sorunun cevab\u0131, modern veri taban\u0131 y\u00f6netiminin kalbi olan CRUD (Create, Read, Update, Delete) i\u015flemlerinde gizlidir. Bu makalede, \u00f6zellikle esnek yap\u0131s\u0131yla dikkat \u00e7eken NoSQL veritaban\u0131 MongoDB \u00fczerinde, bir \u00fcniversite \u00f6\u011frenci y\u00f6netim sistemi \u00f6rne\u011fi \u00fczerinden CRUD i\u015flemlerini ad\u0131m ad\u0131m, uygulamal\u0131 bir \u015fekilde ke\u015ffedece\u011fiz. Bu rehber sayesinde MongoDB ile veri manip\u00fclasyonunun inceliklerini s\u0131f\u0131rdan \u00f6\u011frenerek projelerinizde rahatl\u0131kla uygulayabileceksiniz.","og_url":"https:\/\/fatihsoysal.com\/blog\/mongodb-crud-islemleri-universite-ogrenci-yonetim-sistemi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-08T19:02:12+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"30 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/mongodb-crud-islemleri-universite-ogrenci-yonetim-sistemi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/mongodb-crud-islemleri-universite-ogrenci-yonetim-sistemi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"MongoDB CRUD \u0130\u015flemleri: \u00dcniversite \u00d6\u011frenci Y\u00f6netim Sistemi","datePublished":"2025-10-08T19:02:12+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/mongodb-crud-islemleri-universite-ogrenci-yonetim-sistemi\/"},"wordCount":4239,"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\/mongodb-crud-islemleri-universite-ogrenci-yonetim-sistemi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/mongodb-crud-islemleri-universite-ogrenci-yonetim-sistemi\/","url":"https:\/\/fatihsoysal.com\/blog\/mongodb-crud-islemleri-universite-ogrenci-yonetim-sistemi\/","name":"MongoDB CRUD \u0130\u015flemleri: \u00dcniversite \u00d6\u011frenci Y\u00f6netim Sistemi","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-08T19:02:12+00:00","description":"G\u00fcn\u00fcm\u00fcz dijital d\u00fcnyas\u0131nda, ister basit bir web uygulamas\u0131 isterse karma\u015f\u0131k bir kurumsal sistem olsun, her yaz\u0131l\u0131m\u0131n temelinde veri y\u00f6netimi yatar. Peki, bu verileri nas\u0131l olu\u015fturur, okur, g\u00fcnceller ve sileriz? \u0130\u015fte bu sorunun cevab\u0131, modern veri taban\u0131 y\u00f6netiminin kalbi olan CRUD (Create, Read, Update, Delete) i\u015flemlerinde gizlidir. Bu makalede, \u00f6zellikle esnek yap\u0131s\u0131yla dikkat \u00e7eken NoSQL veritaban\u0131 MongoDB \u00fczerinde, bir \u00fcniversite \u00f6\u011frenci y\u00f6netim sistemi \u00f6rne\u011fi \u00fczerinden CRUD i\u015flemlerini ad\u0131m ad\u0131m, uygulamal\u0131 bir \u015fekilde ke\u015ffedece\u011fiz. Bu rehber sayesinde MongoDB ile veri manip\u00fclasyonunun inceliklerini s\u0131f\u0131rdan \u00f6\u011frenerek projelerinizde rahatl\u0131kla uygulayabileceksiniz.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/mongodb-crud-islemleri-universite-ogrenci-yonetim-sistemi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/mongodb-crud-islemleri-universite-ogrenci-yonetim-sistemi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/mongodb-crud-islemleri-universite-ogrenci-yonetim-sistemi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"MongoDB CRUD \u0130\u015flemleri: \u00dcniversite \u00d6\u011frenci Y\u00f6netim Sistemi"}]},{"@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\/31344","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=31344"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31344\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31344"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31344"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31344"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}