Kurs
Muhtemelen ilişkisel veritabanlarını duydunuz ya da onlarla çalıştınız. Satır-tablo formatı, bilgiyi saklamak için en popüler ve sezgisel yapıdır. Ne yazık ki, karşınıza çıkan tüm verileri satırlara ve tablolara sığdıramazsınız. Aslında, gerçek dünyadaki pek çok problem ilişkisel olmayan veritabanlarını gerektirir. Peki alternatifler var mı?
Cevap EVET! Satırlar veya tabloları olmayan dört tür veritabanı vardır. SQL ile sorgulanamadıkları için NoSQL veritabanları olarak adlandırılırlar. Bunlar:
- Anahtar-değer veritabanları
- Belge veritabanları
- Sütun aileli veritabanları
- Graf veritabanları
Bu makale, belge veritabanlarına ve MongoDB adlı bir sunucunun nasıl kullanılacağına odaklanır. Ancak teknik ayrıntılara geçmeden önce, belge veritabanlarının kullanım alanlarına bakalım. Onlar hakkında daha fazla bilgi için graf veritabanlarına dair ayrı rehberimize göz atabilirsiniz.
Belge Veritabanları Ne Zaman Kullanılır?
Belge veritabanlarını seçmenin başlıca kullanım alanlarından biri, verinizin tablo gibi önceden tanımlı bir şemaya düzgünce oturmaması durumudur. Pek çok sektördeki süreçler veya uygulamalar bu tür verileri depolar. İşte bazı örnekler:
- Web ve mobil uygulamalar: Kullanıcı profilleri, tercihleri, içerik ve etkileşimler
- İçerik yönetim sistemleri: Metin, görseller, video, GIF vb. gibi daha geniş bir yelpazede medya depolama
- E-ticaret platformları: Ürün katalogları, müşteri bilgileri, sipariş geçmişi, stok vb.
- Oyun: Oyuncu profilleri, liderlik tablosu sıralamaları
- Günlükleme ve veri toplama: Analiz için büyük hacimlerde günlükler, olaylar, metrikler vb.
Bu sektörlerden toplanan verilerin tablolara nasıl sığacağını bir düşünün. Örneğin, e-ticaret platformları ürün kataloglarını önceden tanımlı bir şemada depolamakta zorlanır. Farklı ürünlerin farklı nitelikleri ya da daha da kötüsü, farklı sayıda niteliği vardır. 100 farklı markanın 10 fiziksel niteliğe sahip dronlarını depolamak için 10 sütuna mı, yoksa bir kitabın bilgilerini saklamak için sadece 5–6 sütuna mı ihtiyacınız var?
Tablo tabanlı veritabanları bu tür senaryolarda yardımcı olamaz. MongoDB gibi belge veritabanlarını kullanarak şu avantajları elde edersiniz:
- Bir şema tasarlamak için peşin geliştirme maliyeti yoktur
- Belgeler (veri) zaman içinde değişebilir (veri türleri, öznitelik sayısı vb. dahil)
- Belge veritabanları join işlemlerinden kaçınır; bu da çok daha hızlı sorgulama sağlar
- Geliştiriciler için sezgiseldir; çünkü belge veritabanları çoğunlukla büyük JSON dosyalarıdır ve Python kullanıcıları için kocaman sözlükler gibidir.
- Belge veritabanları yatay ölçeklenir; yani veritabanı büyüdükçe giderek daha fazla hesaplama kaynağı gerekmez.
Şimdi, belge veritabanları ve MongoDB etrafındaki temel kavramlara bakalım.
MongoDB Etrafındaki Temel Kavramlar
Bu noktaya kadar belge veritabanları deyip durdum, peki aslında nedirler? İşte ana kavramlar:
- Belgeler: Veriler, belge adı verilen nesnelerde saklanır. Basitçe söylemek gerekirse, belgeler JSON anahtar-değer nesnelerine benzer. Tek bir belge bir tabloda bir satıra denktir. Bir Python programcısıysanız, bir belgeyi sözlük gibi düşünebilirsiniz ve sorun olmaz. Yalnız unutmayın, belgeler iç içe belgeler içerebilir; bu da belge veritabanlarının temel özelliklerinden biridir.
- Koleksiyonlar: Koleksiyonlar ilişkisel veritabanlarındaki tablolara benzer ama satırlar yerine, tahmin ettiğiniz gibi, belgeler içerir. Koleksiyonlar binlerce veya milyonlarca sözlük barındırabilen dev veri yapılarıdır.
- Şemasız: İşin ilginçleştiği yer burası. Bir koleksiyon farklı boyutlarda belgelere sahip olabilir. Örneğin, 1 numaralı belgede 10 anahtar-değer çifti varken 2 numaralı belgede 15 olabilir (koleksiyonun anlamlı olması için bilginin aynı kategori/konu hakkında olması koşuluyla, örneğin ürünler gibi).
İşte ilişkisel veritabanları ile belge veritabanları arasındaki farkları özetleyen harika bir tablo:
| Özellik | Belge Veritabanları (örn. MongoDB) | İlişkisel Veritabanları (örn. MySQL, PostgreSQL) |
|---|---|---|
| Veri Yapısı | Verileri belgeler (örn. JSON, BSON) olarak saklar; esnek, hiyerarşik yapılara izin verir. | Verileri önceden tanımlı bir şemayı izleyen satır ve sütunlardan oluşan tablolarda saklar. |
| Şema Esnekliği | Şemasız: Belgeler farklı yapılara sahip olabilir; farklı alanlara ve veri türlerine izin verir. | Sabit şema: Belirli sütunlar ve veri türlerinden oluşan önceden tanımlı bir şema gerektirir. |
| Sorgu Dili | Nesne tabanlı ve daha esnek olan MongoDB Sorgu Dili (MQL) veya benzerlerini kullanır. | Yapılandırılmış verileri sorgulamak için SQL (Structured Query Language) kullanır. |
| Join İşlemleri | İlişkili verileri belgelerin içine gömerek join işlemlerinden kaçınır (denormalizasyon). | Tablolar arasında karmaşık join işlemlerini destekler (normalizasyon). |
| Performans | Yapılandırılmamış veya yarı yapılandırılmış verilerde okuma ve yazmalar daha hızlıdır. Join kaynaklı ek yükten kaçınır. | Yapılandırılmış verilerde güçlü performans; ancak join işlemleri sorguları yavaşlatabilir. |
| Ölçeklenebilirlik | Yatay ölçeklenebilir: Sharding kullanarak veriyi birden fazla sunucuya dağıtabilir. | Genellikle dikey ölçeklenebilir: Daha güçlü donanıma dayanır; bazıları yatay ölçeklemeyi de destekler (örn. bölümleme). |
| İşlem Desteği | Çok belgeli ACID işlemlerini destekler (MongoDB 4.0 ve üzeri); ancak başlangıçta işlemsel olmayan operasyonlar için tasarlanmıştır. | ACID uyumlu işlemler için tam destek sunar; güçlü tutarlılık ve güvenilirlik sağlar. |
| Kullanım Alanları | Kullanıcı profilleri, günlükler, kataloglar ve esnek veri yapıları gibi yapılandırılmamış veya yarı yapılandırılmış veriler için idealdir. | Finansal kayıtlar veya kurumsal kaynak planlama (ERP) gibi net ilişkileri olan yapılandırılmış veriler için idealdir. |
| Veri İlişkileri | Gömülü verileri (denormalizasyon) destekler; bu sayede ilgili bilgileri tek bir sorguyla getirmek kolaydır. | İlişkisel veritabanları, tablolar arası ilişkileri kurmak için yabancı anahtarlara dayanır (normalizasyon). |
| Indeksleme | Indekslemeyi destekler; ancak ilişkisel veritabanlarındaki kadar çeşitli ve sofistike olmayabilir. | Daha iyi performans optimizasyonu için birden çok indeks türünü (örn. B-tree, hash) destekleyen güçlü indeksleme yetenekleri sunar. |
| Tutarlılık | Dağıtık kurulumlarda nihai tutarlılık sağlar; gerektiğinde güçlü tutarlılık da sunar (ACID işlemleriyle). | ACID işlemleri ve ilişkisel bütünlük sayesinde çoğu durumda güçlü tutarlılık sağlar. |
| Veri Hacmini Ölçekleme | Sunucu ekleyerek (sharding) büyük veri hacimlerine kolayca ölçeklenir. | Dikey ölçeklenebilir; ancak yatay ölçekleme daha karmaşık yapılandırma gerektirir (örn. bölümleme). |
| Veri Bütünlüğü | Veri bütünlüğü her belgenin içinde yönetilir; belgeler arası ilişkileri yönetmek daha zor olabilir. | Benzersiz (UNIQUE) ve NOT NULL gibi kısıtlar ile birincil ve yabancı anahtarlar üzerinden güçlü yerleşik veri bütünlüğü desteği sunar. |
| Geliştirici Dostu | Geliştirici dostudur: Esnek veri modelleme, modern uygulamalarla (örn. JSON, REST API’ler) iyi çalışır. | Katı veri modelleme; ancak SQL ve yapılandırılmış veriye aşina geliştiriciler tarafından iyi anlaşılır. |
Hadi artık MongoDB’de belgelerle çalışmaya başlayalım!
MongoDB Kurulumu: Veri Kaynaklarına Bağlanma
Belge veritabanlarını sorgulamak için MongoDB sunucusunu kurmamız gerekir. Platforma özel talimatlar şunlardır:
- Windows için, bu bağlantıdaki talimatları izleyin.
- Unix benzeri sistemlerde, MongoDB’yi terminalden kurabilirsiniz:
$ sudo apt-get install -y mongodb
Ardından, sanal bir ortam içinde pymongo ve requests kütüphanelerini kurun. pymongo, MongoDB sunucusunun resmi Python bağdaştırıcısıdır. requests kütüphanesine ise bir API’den veri çekmek için ihtiyaç duyacağız.
$ pip install pymongo
$ pip install requests
Sonra, terminalden aşağıdaki komutla MongoDB sunucusunu başlatın:
$ sudo service mongodb start
Artık bir belge veritabanına biraz veri yüklemeye hazırız. Bunu yaparken iki senaryo vardır:
- Uygun formatlarda (JSON, BSON, YAML veya XML) yerel veriye sahipsiniz.
- Veriyi harici kaynaklardan, genellikle API’lerden çekmeniz gerekiyor.
İkisini de ele alacağız. Önce, yerelde drone_races.json adlı bir koleksiyonu yükleyelim. İşte bunun için bir parça kod:
import json
from pymongo import MongoClient
# Establish connection to MongoDB
client = MongoClient("localhost", 27017)
# Create a database named "drones"
drones = client["drones"]
# Create a collection named "races"
races = drones["races"]
# Load dataset into MongoDB
with open("data/drone_races.json", "r") as file:
data = json.load(file)
races.insert_many(data)
Bizim için en önemli iki nesne drones (bir veritabanı) ve races (bir koleksiyon). Fonksiyon ve metotların çoğu koleksiyonlarla ilgilidir. Veritabanı nesneleri çoğunlukla koleksiyonları yönetmek için kullanılır.
Şimdi, aynı veriyi bir API kullanarak nasıl yükleyeceğimize bakalım. Bilgileri Mockaroo adlı bir hizmeti kullanarak bir API olarak sakladım. İşte kod parçası:
import requests
from pymongo import MongoClient
# Fetch data from the API
api_url = (
"https://my.api.mockaroo.com/drone_race_matches.json?key=6f5a6b50"
)
response = requests.get(api_url)
if response.status_code == 200:
data = response.json() # Get the JSON data from the API
# Establish a connection to MongoDB
client = MongoClient()
# Access or create a specific database
drones = client["drones"]
# Access or create a specific collection within the database
races = drones["races"]
# Insert the fetched data into the MongoDB collection
races.insert_many(data)
else:
print("Failed to fetch data from the API.")
drones belge veritabanının races koleksiyonuna biraz veri yükledik, yoksa yüklemedik mi? Sorgularla kontrol edelim!
Temel MongoDB Sorguları
MongoDB’de belgeleri sayma
Bir koleksiyonda veri olup olmadığını öğrenmek için içindeki belgeleri saymamız gerekir. Bunu yapmak için count_documents metodunu kullanacağız:
>>> races.count_documents({})
9040
count_documents’a geçirilen boş sözlüğe dikkat edin. Bu sözlük, MongoDB’de filtre olarak adlandırılır. Eğitim boyunca, farklı türde filtreler oluşturmak için bu sözlüğü nasıl dolduracağımızı öğreneceğiz. Şu anda filtre yok. Yukarıdaki kod, SQL’de SELECT COUNT(*) FROM table_name ile aynıdır.
9040 belge var — harika! Şimdi biraz veriye bakalım.
MongoDB’de tek bir belgeyi çıkarmak
pymongo ile tek bir belgeye bakmak için find_one metodunu kullanabiliriz:
from pprint import pprint
>>> pprint(races.find_one())
{'_id': ObjectId('659d31e9255ec0cf4bab529d'),
'laps': 3,
'league': 'F1 Drones',
'location': {'city': 'Ford',
'country': 'United Kingdom',
'date': 'error: invalid date "2024-10-25"',
'venue': 'Manhattan Seas'},
'name': 'Honorable',
'pilots': {'drone': 'DJI3-old',
'finishing_position': 66,
'name': 'Kariotta Cow',
'qualification_time': 27.39,
'team': 'Sky Crusaders',
'telemetry': {'altitude': 34.3,
'battery_voltage': 12.1,
'speed': 68.3,
'timestamp': 'error: invalid date '
'"2024-10-25T14:09:26Z"'}},
'sponsors': ['Fat Shark', 'DJI', 'Etisalat'],
'weather_conditions': 'snowy'}
Bu belgenin alanlarına (anahtarlarına) dikkat edin. Tek bir drone yarışına dair bilgiler saklanır ve şunlar gibi bilgileri içerir:
- Tur sayısı
- Maç sırasındaki hava koşulları
- Maçtaki pilotlar (hepsi değil)
- Maç sponsorları vb.
Belgede ayrıca benzersiz bir hash olan zorunlu _id alanı bulunur.
MongoDB’de tüm belgeleri seçmek
count_documents her zaman bir sayı döndürür; ancak bazen sorgumuzun eşleştiği veriye bakmak isteriz. Bunu yapmak için find_one’ın abisi olan find’ı kullanabiliriz:
from pprint import pprint
for race in races.find():
pprint(race)
break
{'_id': ObjectId('659d31e9255ec0cf4bab529d'),
'laps': 3,
'league': 'F1 Drones',
'location': {'city': 'Ford',
'country': 'United Kingdom',
'date': 'error: invalid date "2024-10-25"',
'venue': 'Manhattan Seas'},
'name': 'Honorable',
'pilots': {'drone': 'DJI3-old',
'finishing_position': 66,
'name': 'Kariotta Cow',
'qualification_time': 27.39,
'team': 'Sky Crusaders',
'telemetry': {'altitude': 34.3,
'battery_voltage': 12.1,
'speed': 68.3,
'timestamp': 'error: invalid date '
'"2024-10-25T14:09:26Z"'}},
'sponsors': ['Fat Shark', 'DJI', 'Etisalat'],
'weather_conditions': 'snowy'}
find, boş bir sorgu (argümansız) ile belgeleri teker teker döndürür ama istediğimiz bu değil! İlginç sorulara yanıt verebilmek için sorgular yapmak istiyoruz. İşte burada filtre belgeleri faydalı olacaktır.
MongoDB’de bir koşula göre seçim yapmak
En basit filtrelerle başlayalım — bir alanın bir değere eşit olduğu belgeleri eşleştirmek. Bu, şuna denktir:
SELECT *
FROM table_name
WHERE field = value
Bunu MongoDB’de yapalım:
criteria = {"sponsors": "Fat Shark"}
fat_shark_races = races.count_documents(criteria)
fat_shark_races
6194
Yukarıda, sponsoru "Fat Shark" olan yarışları seçiyoruz. Sözdizimi, sponsors alanını "Fat Shark"a eşleyen basit bir sözlüktür.
MongoDB sorgu dili, bazı yaygın eşitsizlik (inequality) operatörleri olmadan bir dil olmazdı. İşte “küçüktür” operatörünün kullanımı:
criteria = {"pilots.qualification_time": {"$lt": 10}}
quick_races = races.count_documents(criteria)
quick_races
3061
Yukarıdaki sorgu, MongoDB sorgu dilinin (MQL) dört yeni özelliğini tanıtır:
- Alt alanlara nokta gösterimiyle erişebilirsiniz.
pilots.qualification_time, pilotlar alanı içindeki iç içe geçmiş elemeler süresini çıkarır. - MQL’de operatörlerin neredeyse tümü dolar işaretiyle başlar.
- Operatörler yukarıdaki gibi iç içe bir belgede kullanılır.
$lt, “küçüktür” operatörüdür.
Yani bu sorgunun sonucu bize, bir pilotun elemeler süresinin 10 saniyeden kısa olduğu 3061 maç olduğunu söylüyor. Bu sorgu $lt operatörü ile mümkün oldu. İşte onun kardeşleri:
$lte: küçük eşit$gt: büyük$gte: büyük eşit.
Bunların sözdizimi $lt ile aynıdır.
MongoDB’de mantıksal koşul operatörleriyle seçim yapmak
MQL, $and ve $or gibi mantıksal koşul operatörlerini de içerir. Sonuncusuyla başlayalım.
Konum olarak Birleşik Krallık ya da sponsor olarak Etisalat olan yarışları getireceğiz:
criteria = {
"$or": [
{"location.country": "United Kingdom"},
{"sponsors": "Etisalat"},
]
}
>>> races.count_documents(criteria)
6223
Yine, ayrıntılı bir açıklama için Explain code düğmesini kullanın.
Kriterlerimize uyan 6223 belge var. Aynı alan için birden fazla değerle OR mantığını kullanmak için $in operatörünü kullanabiliriz.
Örneğin, kötü hava koşullarını şu şekilde kontrol edebiliriz:
criteria = {
"weather_conditions": {"$in": ["rainy", "snowy", "cloudy"]}
}
>>> races.count_documents(criteria)
5508
Bu sorguyu $or operatörüyle yazmak eziyet olurdu. Şimdi $and’e geçelim.
Bu kez, konumu Avustralya VE sponsoru Fat Shark olan yarışları bulmak istiyoruz. Bunu $and ile şöyle yapabiliriz:
criteria = {
"$and": [
{"location.country": "Australia"},
{"sponsors": "Fat Shark"},
]
}
>>> races.count_documents(criteria)
193
Ama pratikte $and’i nadiren kullanırsınız; çünkü çok daha basit bir şekilde uygulanabilir:
criteria = {
"location.country": "Australia",
"sponsors": "Fat Shark",
}
races.count_documents(criteria)
193
AND mantıksal operatörünü elde etmek için filtre belgesine daha fazla anahtar-değer çifti eklemeniz yeterlidir.
Son olarak, üyelik dışılığını kontrol eden $nin operatörü vardır. Örneğin, Amerika Birleşik Devletleri, Birleşik Krallık veya Avustralya’da yapılmamış tüm maçları döndürebiliriz:
criteria = {
"location.country": {
"$nin": ["United States", "United Kingdom", "Australia"]
}
}
>>> races.count_documents(criteria)
126
Bu, ülkelerden geriye sadece Birleşik Arap Emirlikleri’ni bırakır; bu yüzden yukarıdaki sorgu aslında şöyle de yazılabilirdi:
criteria = {"location.country": "United Arab Emirates"}
>>> races.count_documents(criteria)
126
Ama fikir anlaşıldı.
MongoDB’de null ya da eksik değerleri sorgulamak
Null ya da eksik değerleri kontrol etmek tüm veri analizi görevlerinde evrensel bir işlemdir. Bu nedenle MongoDB’de bunun için bir operatör vardır — $exists. İşte belirli bir alanın var olup olmadığını kontrol eden iki örnek:
criteria = {"location.district": {"$exists": True}}
>>> races.count_documents(criteria)
0
Hmm, anlaşılan district alanı hiçbir belgede yok. Ancak laps alanı tüm belgelerde bulunmalı; çünkü yarışlar hakkında kilit bir bilgidir.
criteria = {"laps": {"$exists": True}}
races.count_documents(criteria)
9040
Beklendiği gibi, tüm belgelerde laps alanı var. Peki var olup da null olan alanlar? Onu da kontrol edebiliriz:
criteria = {"pilots.finishing_position": None}
races.count_documents(criteria)
0
Python’daki yerleşik None nesnesini kullanarak herhangi bir alanın eksikliğini kontrol edebiliriz.
Null ya da varlık kontrolleri gerektiren bazı ileri düzey senaryolar da vardır. Örneğin, bazı dev iç içe dizilerin belirli elemanlarının var olup olmadığını kontrol etmek isteyebilirsiniz.
Bunu yapmak için MQL’de dizi indeksleme sözdizimini kullanabiliriz. Örneğin, yalnızca bir sponsoru olan yarışları bulmak için sponsors dizisinin ikinci elemanının var olup olmadığını kontrol etmemiz gerekir:
# Sayım her zamanki gibi 0’dan başlar
criteria = {"sponsors.1": {"$exists": False}}
races.count_documents(criteria)
2929
Ve bu, anahtara elemanın indeks numarasını eklemek kadar kolaydır. Yani koleksiyonumuzda, neredeyse 3000 yarış yalnızca bir kuruluş tarafından sponsor edilmiştir.
Bu dizi indeksleme sözdizimi sadece $exists için değil, birçok diğer operatör için de çalışır.
Projeksiyonlar (alanları kısıtlama)
Eğitimde ele alacağımız son konu projeksiyonlar. Bu noktaya kadar, sorgu sonuçlarımız her belgedeki tüm alanları içeriyordu. Belgeleriniz yüzlerce alana sahipse bu ideal değildir. Yazdırdığınızda nasıl bir göz yorgunluğu yaratacağını hayal edin!
Bu nedenle, döndürülmesini istediğimiz alanları seçmek için projeksiyonları kullanabiliriz. İşte nasıl yapılacağı:
criteria = {"pilots.telemetry.speed": {"$gte": 20}}
projection = {
"sponsors": 1,
"location.country": 1,
"pilots.telemetry.speed": 1,
"pilots.name": 1,
}
fast_pilots = races.find(criteria, projection)
for pilot in fast_pilots:
pprint(pilot)
break
Yukarıdaki durumda, filtre kriterimizi her zamanki gibi yazıyoruz; fakat bu kez dört alanı 1’e ayarlı başka bir belge tanımlıyoruz. Bu projection belgesini find veya count_documents’a ikinci argüman olarak verirsek, çıktı olarak yalnızca 1’e ayarladığımız alanları alırız.
{'_id': ObjectId('659d31e9255ec0cf4bab529d'),
'location': {'country': 'United Kingdom'},
'pilots': {'name': 'Kariotta Cow', 'telemetry': {'speed': 68.3}},
'sponsors': ['Fat Shark', 'DJI', 'Etisalat']}
Yalnızca dört alan seçmiş olmamıza rağmen, yaramaz _id alanı bir şekilde araya sıkıştı. Bu davranışı bastırmak için projeksiyon sözlüğünde onu 0’a ayarlayın:
criteria = {"pilots.telemetry.speed": {"$gte": 20}}
projection = {
"sponsors": 1,
"location.country": 1,
"pilots.telemetry.speed": 1,
"pilots.name": 1,
"_id": 0,
}
fast_pilots = races.find(criteria, projection)
for pilot in fast_pilots:
pprint(pilot)
break
{'location': {'country': 'United Kingdom'},
'pilots': {'name': 'Kariotta Cow', 'telemetry': {'speed': 68.3}},
'sponsors': ['Fat Shark', 'DJI', 'Etisalat']}
İşte şimdi daha hoş görünüyor.
Son olarak, birkaç alan dışında hepsini döndürmek için, o alanları 0’a ayarlayabiliriz:
projection = {"_id": 0, "league": 0, "pilots": 0}
# Bu sefer boş kriter
races.find_one({}, projection)
{'name': 'Honorable',
'location': {'venue': 'Manhattan Seas',
'city': 'Ford',
'country': 'United Kingdom',
'date': 'error: invalid date "2024-10-25"'},
'sponsors': ['Fat Shark', 'DJI', 'Etisalat'],
'laps': 3,
'weather_conditions': 'snowy'}
Gördüğünüz gibi, bu kez _id, league ve pilots dışında tüm alanlara sahibiz.
Sonuç
Bu eğitim, bir veritabanı yönetim aracı olarak MongoDB’nin devasa kapsamını tam olarak yansıtmaz. Bugün yalnızca GET sorgularını (bilgi getirme sorguları) ele aldık; ancak MongoDB, veri uzmanlarının belge veritabanlarındaki bilgileri eklemesine, güncellemesine veya silmesine de izin verir. Ayrıca tüm bir sorgu sınıfını — toplulaştırmaları (aggregations) — da dışarıda bıraktık.
Tüm bu konular bu makalenin kapsamı dışındadır ve öğrenmek için ek kaynaklar gerektirir. Neden şunlara göz atmıyorsunuz:
- Python ile veri biliminde MongoDB kullanmaya giriş kursu — toplulaştırma gibi ileri düzey sorguları da kapsayan kapsamlı bir kurs
- Python’da MongoDB’ye Giriş — pymongo ile CRUD (oluşturma, okuma, güncelleme ve silme) işlemlerini kapsayan bir başka MongoDB eğitimi.
- NoSQL kavramları kursu — NoSQL veritabanlarıyla ilgileniyorsanız bu kurs size göre. Belge veritabanlarının yanı sıra diğer ilişkisel olmayan veritabanlarını da kapsar.
SSS
MongoDB gibi belge veritabanları, ilişkisel veritabanlarından nasıl farklıdır?
MongoDB gibi belge veritabanları verileri, iç içe veri yapıları barındırabilen belgelerde (genellikle JSON benzeri formatlarda) saklar. Bu, verileri sabit bir şemaya sahip satırlar ve tablolarda saklayan ilişkisel veritabanlarından farklıdır. Belge veritabanları daha fazla esneklik sağlar; çünkü şema dinamiktir ve her belge farklı alanlara ve veri türlerine sahip olabilir. Bu, ilişkisel veritabanlarının önceden tanımlı bir şema gerektirdiği durumların aksine, MongoDB’yi yapılandırılmamış veya yarı yapılandırılmış veriler için uygun kılar.
Neden ilişkisel bir veritabanı yerine MongoDB kullanmalıyım?
Veriniz tablo yapısına düzgünce oturmuyorsa MongoDB avantajlıdır. Verinizin esnek bir şeması varsa, veri yapısında sık değişiklikler bekliyorsanız ya da büyük hacimli yapılandırılmamış verileri işlemeniz gerekiyorsa MongoDB kullanın. E-ticaret, günlükleme ve içerik yönetim sistemleri gibi, ölçekli ve yüksek hızlı okuma-yazma operasyonları gerektiren uygulamalar için de iyi bir seçimdir.
MongoDB ile hangi programlama dilleri uyumludur?
MongoDB, resmi sürücüler ve kütüphaneler aracılığıyla Python, Java, JavaScript, Node.js, Go, Ruby ve C# dahil geniş bir programlama dili yelpazesiyle uyumludur. Python kütüphanesi pymongo, veri bilimi uygulamalarında MongoDB ile etkileşim için yaygın olarak kullanılır. MongoDB ayrıca Django, Flask ve Express.js gibi modern çerçevelerle iyi entegre olur.
MongoDB büyük ölçekli veriyi ve yatay ölçeklemeyi nasıl ele alır?
MongoDB, veriyi sharding yoluyla birden çok sunucuya dağıtarak yatay ölçekleme için tasarlanmıştır; bu sayede büyük ölçekli veriyi verimli şekilde yönetir. Veriniz büyüdükçe MongoDB yükü birden fazla makineye dağıtabilir ve daha iyi performans ile kapasite sağlar. Bu, MongoDB’yi büyük veri uygulamaları veya veri hacminde hızlı büyüme yaşayan uygulamalar için ideal kılar.
MongoDB, SQL veritabanları gibi karmaşık sorguları işleyebilir mi?
MongoDB karmaşık sorguları işleyebilir; ancak sorgu dili (MQL, MongoDB Query Language) SQL’den oldukça farklıdır. MongoDB, verileri alma, filtreleme ve dönüştürme işlemleri için filtreler, projeksiyonlar, mantıksal operatörler ve toplulaştırmaları destekler. Ancak, SQL veritabanlarının aksine MongoDB, aynı şekilde join işlemlerini desteklemez; çünkü esnek belge yapılarıyla denormalize veriye göre tasarlanmıştır.
MongoDB gerçek zamanlı analitik için uygun mu?
MongoDB gerçek zamanlı analitik için kullanılabilir; ancak performans büyük ölçüde verinin nasıl yapılandırıldığına ve indekslendiğine bağlıdır. MongoDB’nin güçlü indeksleme ve toplulaştırma çerçevesini kullanarak gerçek zamanlı sorgular çalıştırabilir ve içgörüler üretebilirsiniz. Ancak, daha karmaşık analitik görevler için MongoDB’yi Apache Spark gibi araçlarla entegre etmeyi veya aggregation framework’ünü büyük ölçekli gerçek zamanlı işlemeyi ele almak için kullanmayı düşünebilirsiniz.
MongoDB’deki güvenlik özellikleri nelerdir?
MongoDB, kimlik doğrulama, yetkilendirme (rol tabanlı erişim kontrolü), şifreleme (aktarılırken ve beklerken) ve denetim dahil olmak üzere çeşitli güvenlik özellikleri sağlar. MongoDB’nin Kurumsal Sürümü, kurumsal düzeyde güvenlik için LDAP entegrasyonu ve Kerberos kimlik doğrulaması gibi ek güvenlik özellikleri sunar. Bu özellikler, hassas verileri güvence altına alırken sektör düzenlemelerine uyumu sürdürmeye yardımcı olur.
MongoDB ACID işlemlerini destekler mi?
Evet, özellikle 4.0 sürümünden itibaren MongoDB ACID uyumlu işlemleri destekler. Bu, ilişkisel veritabanlarındaki gibi çok belgeli işlemlere olanak tanır ve birden çok belge veya koleksiyonu içeren işlemler için atomiklik, tutarlılık, izolasyon ve dayanıklılık sağlar. Bu da MongoDB’yi işlem garantileri gerektiren senaryolar için daha uygun hale getirir.
MongoDB’de JSON ve BSON arasındaki fark nedir?
JSON veriyi temsil etmek için yaygın kullanılan, insan tarafından okunabilir bir formattır; BSON (Binary JSON) ise MongoDB’nin depolama formatıdır. BSON, daha verimli depolama ve alma sağlar ve JSON’un doğal olarak ele almadığı tarih ve ikili veri gibi ek veri türlerini destekler. BSON ayrıca daha fazla meta veri ekler; bu da belge depolama ve alma sırasında performansı artırır.
2 yılı aşkın deneyime sahip bir veri bilimi içerik üreticisiyim ve Medium’da en büyük takipçi kitlelerinden birine sahibim. Yapay zekâ ve makine öğrenimi üzerine, biraz da alaycı bir üslupla yazılmış, ayrıntılı makaleler kaleme almayı seviyorum; çünkü onları biraz daha az sıkıcı hale getirmek için bir şeyler yapmak gerekiyor. 130’un üzerinde makale ve bir de DataCamp kursu ürettim; bir diğeri de hazırlık aşamasında. İçeriklerim 5 milyondan fazla kişi tarafından görüldü; bunların 20 bini Medium ve LinkedIn’de takipçim oldu.

