MongoDB’de PyMongo Kullanarak CRUD Operasyonları Nasıl Yapılır? (Ubuntu 20.04 Üzerinde)
Giriş
Günümüzün hızla değişen veri dünyasında, ilişkisel olmayan (NoSQL) veritabanları, esneklikleri, ölçeklenebilirlikleri ve yüksek performansları nedeniyle giderek daha fazla tercih edilmektedir. Bu NoSQL veritabanlarının en popülerlerinden biri olan MongoDB, belge tabanlı yapısıyla geliştiricilere büyük kolaylıklar sunar. Veriler JSON benzeri BSON formatında saklandığı için, modern web uygulamaları ve veri odaklı projeler için ideal bir çözümdür. Python ise, basit sözdizimi, geniş kütüphane ekosistemi ve veri işleme yetenekleri sayesinde en çok kullanılan programlama dillerinden biridir. Python’ın MongoDB ile etkileşim kurmasını sağlayan kütüphane ise PyMongo’dur.
Bu makalede, Ubuntu 20.04 işletim sistemi üzerinde MongoDB’yi kurmaktan başlayarak, PyMongo kütüphanesini kullanarak temel CRUD (Create, Read, Update, Delete) operasyonlarını adım adım nasıl gerçekleştireceğinizi ayrıntılı bir şekilde ele alacağız. Amacımız, hem yeni başlayanlar hem de deneyimli geliştiriciler için kapsamlı bir rehber sunarak, gerçek dünya uygulamalarında MongoDB ve PyMongo’nun gücünden nasıl faydalanabileceğinizi göstermektir. Her bir adım, net açıklamalar ve çalıştırılabilir kod örnekleri ile desteklenecektir, böylece okuyucular teorik bilgiyi pratik uygulamalarla pekiştirebilirler.
Ön Gereksinimler ve Ortam Kurulumu
PyMongo ile MongoDB’de CRUD operasyonlarına başlamadan önce, gerekli yazılımları Ubuntu 20.04 sistemimize kurmamız gerekmektedir.
Ubuntu 20.04 Kurulumu (Varsayım)
Bu makale, Ubuntu 20.04’ün sisteminizde kurulu ve güncel olduğunu varsaymaktadır. Eğer kurulu değilse, öncelikle işletim sisteminizi kurmanız gerekmektedir.
MongoDB Kurulumu
MongoDB’yi Ubuntu 20.04’e kurmak için aşağıdaki adımları izleyin. Bu adımlar, MongoDB’nin resmi dokümantasyonuna dayanmaktadır.
1. MongoDB Ortak GPG Anahtarını İçe Aktarma:
MongoDB paketlerini doğrulamak için gerekli olan GPG anahtarını sisteminize ekleyin.
wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
Bu komut, anahtarı indirir ve apt anahtar halkasına ekler. Anahtarın başarıyla eklendiğini doğrulamak için “OK” çıktısını görmelisiniz.
2. MongoDB Depo Listesi Dosyasını Oluşturma:
MongoDB’nin resmi deposunu apt kaynaklarınıza ekleyin. Ubuntu 20.04 (Focal Fossa) için aşağıdaki komutu kullanın.
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
Bu komut, MongoDB 4.4 sürümü için bir depo listesi dosyası oluşturur.
3. Yerel Paket Veritabanını Güncelleme:
Yeni eklenen depoyu tanımak için apt paket listesini güncelleyin.
sudo apt update
4. MongoDB Kurulumu:
Şimdi mongodb-org paketini kurabilirsiniz. Bu paket, MongoDB sunucusu, kabuk ve diğer yardımcı programları içerir.
sudo apt install -y mongodb-org
5. MongoDB Servisini Başlatma ve Etkinleştirme:
MongoDB servisini başlatın ve sistem başlangıcında otomatik olarak başlaması için etkinleştirin.
sudo systemctl start mongod
sudo systemctl enable mongod
6. MongoDB Servis Durumunu Doğrulama:
MongoDB’nin doğru şekilde çalışıp çalışmadığını kontrol edin.
sudo systemctl status mongod
Çıktıda “active (running)” ifadesini görmelisiniz.
7. MongoDB Kabuğu ile Test Etme (Opsiyonel):
MongoDB’ye bağlanmak ve temel bir komut çalıştırmak için mongosh kabuğunu kullanabilirsiniz.
mongosh
Kabukta db.version() yazarak MongoDB sürümünü kontrol edebilirsiniz. Çıkmak için exit yazın.
Python ve Pip Kurulumu
Ubuntu 20.04 genellikle Python 3 ile birlikte gelir. Pip, Python paket yöneticisidir ve PyMongo’yu kurmak için gereklidir.
1. Python 3 ve Pip’i Kontrol Etme/Kurma:
sudo apt update
sudo apt install -y python3 python3-pip
Bu komutlar, Python 3 ve pip’in en son sürümlerini kurar veya günceller.
PyMongo Kurulumu
PyMongo’yu kurmak oldukça basittir.
1. PyMongo’yu Kurma:
Sanal ortamda veya genel olarak aşağıdaki komutu kullanarak PyMongo’yu kurun:
pip install pymongo
Bazı durumlarda, DNS SRV kayıtları üzerinden bağlantı kurmak için dnspython paketine de ihtiyaç duyulabilir. Bunu da kurmak iyi bir uygulamadır:
pip install dnspython
Sanal Ortam Oluşturma (Önerilen)
Python projeleri için sanal ortamlar kullanmak, bağımlılık çakışmalarını önlemek ve proje bazında bağımlılıkları yönetmek için en iyi uygulamadır.
1. Sanal Ortam Oluşturma:
Proje dizininizde bir sanal ortam oluşturun:
mkdir pymongo_crud_project
cd pymongo_crud_project
python3 -m venv venv_pymongo
2. Sanal Ortamı Etkinleştirme:
source venv_pymongo/bin/activate
Komut isteminizin başında (venv_pymongo) gibi bir ibare görmelisiniz, bu sanal ortamın etkin olduğunu gösterir.
3. Sanal Ortamda PyMongo Kurulumu:
Sanal ortam etkin durumdayken PyMongo’yu kurun:
pip install pymongo dnspython
Artık PyMongo ile MongoDB’ye bağlanmaya ve CRUD operasyonlarını gerçekleştirmeye hazırsınız.
MongoDB ve PyMongo Bağlantısı
MongoDB’ye PyMongo aracılığıyla bağlanmak, herhangi bir veritabanı işlemi için ilk adımdır.
Bağlantı Kurma
PyMongo’da MongoDB sunucusuna bağlanmak için MongoClient sınıfını kullanırız.
from pymongo import MongoClient
import sys
MongoDB bağlantı dizesi
Varsayılan port 27017'dir ve yerel makinede çalışıyorsa localhost kullanılır.
MONGO_URI = "mongodb://localhost:27017/"
try:
# MongoClient nesnesini oluştur
client = MongoClient(MONGO_URI)
print("MongoDB'ye başarıyla bağlanıldı!")
# Bağlantıyı test etmek için bir veritabanı listesi al
print("Mevcut veritabanları:", client.list_database_names())
except Exception as e:
print(f"MongoDB bağlantısı sırasında bir hata oluştu: {e}")
sys.exit(1) # Hata durumunda programı sonlandır
İşiniz bittiğinde bağlantıyı kapatmak iyi bir uygulamadır.
Ancak bu örnekte, CRUD operasyonları için açık tutacağız.
client.close()
Yukarıdaki kodda:
* MongoClient(MONGO_URI) ile MongoDB sunucusuna bir bağlantı oluşturulur. Eğer sunucu farklı bir IP veya port üzerinde çalışıyorsa, MONGO_URI değişkenini buna göre ayarlamanız gerekir (örneğin: mongodb://).
* try-except bloğu, bağlantı sırasında oluşabilecek hataları yakalamak için kullanılır.
* client.list_database_names() metodu, mevcut veritabanlarının listesini döndürerek bağlantının başarılı olduğunu doğrular.
* client.close() metodu, bağlantıyı kapatmak için kullanılır. Genellikle, uygulamanızın ömrü boyunca tek bir MongoClient örneği oluşturmak ve onu yeniden kullanmak daha verimlidir.
Veritabanı ve Koleksiyon Seçimi
MongoDB’de veriler koleksiyonlarda (SQL’deki tablolar gibi) saklanır ve bu koleksiyonlar veritabanları içinde yer alır. PyMongo’da bir veritabanı ve koleksiyon seçmek oldukça kolaydır. MongoDB, veritabanları ve koleksiyonları ilk veri eklendiğinde otomatik olarak oluşturduğu için “lazy” bir yapıya sahiptir.
# Önceki bağlantı kodundan client nesnesini kullanıyoruz
client = MongoClient(MONGO_URI)
Bir veritabanı seçin
İki şekilde erişilebilir: nitelik (attribute) erişimi veya sözlük (dictionary) erişimi
db = client.my_database_name # Nitelik erişimi
veya
db = client['my_database_name'] # Sözlük erişimi (eğer veritabanı adında özel karakterler varsa tercih edilir)
print(f"'{db.name}' veritabanı seçildi.")
Bir koleksiyon seçin
collection = db.my_collection_name # Nitelik erişimi
veya
collection = db['my_collection_name'] # Sözlük erişimi
print(f"'{collection.name}' koleksiyonu seçildi.")
Veritabanı ve koleksiyon henüz diskte fiziksel olarak oluşturulmadı.
İlk belge eklendiğinde oluşturulacaklar.
Bu adımlarla, MongoDB sunucusuna başarıyla bağlandık ve üzerinde çalışacağımız veritabanı ile koleksiyonu seçtik. Artık CRUD operasyonlarına geçebiliriz.
CRUD Operasyonları (Create, Read, Update, Delete)
CRUD, veritabanı uygulamalarının dört temel işlevini temsil eder: Oluşturma (Create), Okuma (Read), Güncelleme (Update) ve Silme (Delete). PyMongo, bu operasyonları gerçekleştirmek için sezgisel ve güçlü metotlar sunar.
1. Create (Oluşturma)
Yeni belgeleri (dokümanları) koleksiyonlara eklemek için kullanılır. PyMongo’da belgeler Python sözlükleri olarak temsil edilir.
Tek Belge Ekleme (insertOne)
insertOne() metodu, koleksiyona tek bir belge eklemek için kullanılır.
# Önceki koddan client, db ve collection nesnelerini varsayıyoruz.
client = MongoClient(MONGO_URI)
db = client.my_database_name
collection = db.my_collection_name
Eklenecek belge (Python sözlüğü)
document_1 = {
"name": "Alice",
"age": 30,
"city": "New York",
"email": "alice@example.com",
"hobbies": ["reading", "hiking"]
}
try:
# Belgeyi ekle
result = collection.insert_one(document_1)
print(f"Tek belge başarıyla eklendi. Eklenen _id: {result.inserted_id}")
except Exception as e:
print(f"Tek belge eklenirken hata oluştu: {e}")
insert_one() metodu, InsertOneResult nesnesi döndürür. Bu nesne, eklenen belgenin otomatik olarak oluşturulan _id alanını inserted_id özelliği aracılığıyla içerir. MongoDB, her belgeye benzersiz bir _id alanı atar.
Birden Fazla Belge Ekleme (insertMany)
insert_many() metodu, koleksiyona birden fazla belgeyi aynı anda eklemek için kullanılır. Belgeler bir Python sözlükleri listesi olarak sağlanır.
# Eklenecek belgeler listesi
documents_2 = [
{
"name": "Bob",
"age": 25,
"city": "Los Angeles",
"email": "bob@example.com",
"hobbies": ["swimming", "gaming"]
},
{
"name": "Charlie",
"age": 35,
"city": "Chicago",
"email": "charlie@example.com",
"hobbies": ["cooking", "photography"]
},
{
"name": "David",
"age": 28,
"city": "New York",
"email": "david@example.com",
"hobbies": ["coding", "cycling"],
"status": "active"
}
]
try:
# Belgeleri ekle
result = collection.insert_many(documents_2)
print(f"Birden fazla belge başarıyla eklendi. Eklenen _id'ler: {result.inserted_ids}")
except Exception as e:
print(f"Birden fazla belge eklenirken hata oluştu: {e}")
insert_many() metodu, InsertManyResult nesnesi döndürür. Bu nesne, eklenen tüm belgelerin _id değerlerini içeren bir liste olan inserted_ids özelliğini içerir.
2. Read (Okuma)
Koleksiyonlardan belge sorgulamak ve almak için kullanılır. PyMongo, esnek sorgulama yetenekleri sunar.
Tüm Belgeleri Okuma (find())
find() metodu, koleksiyondaki tüm belgeleri veya belirli bir filtreye uyan belgeleri almak için kullanılır. Filtre belirtilmezse, tüm belgeler döner. find() bir imleç (cursor) döndürür ve bu imleç üzerinde döngü yaparak belgelere erişilir.
print("\n--- Tüm Belgeleri Okuma ---")
try:
# Koleksiyondaki tüm belgeleri bul
for document in collection.find():
print(document)
except Exception as e:
print(f"Tüm belgeler okunurken hata oluştu: {e}")
Belirli Belgeleri Okuma (find())
find() metoduna bir sorgu sözlüğü (query dictionary) geçirilerek belirli kriterlere uyan belgeler bulunabilir. MongoDB, çeşitli sorgu operatörleri sağlar.
* Eşitlik Sorgusu:
print("\n--- Adı 'Alice' olan belgeleri bul ---")
query = {"name": "Alice"}
for document in collection.find(query):
print(document)
* Karşılaştırma Operatörleri ($gt, $lt, $gte, $lte, $ne):
* $gt: Greater Than (Büyüktür)
* $lt: Less Than (Küçüktür)
* $gte: Greater Than or Equal (Büyük veya eşittir)
* $lte: Less Than or Equal (Küçük veya eşittir)
* $ne: Not Equal (Eşit değildir)
print("\n--- Yaşı 30'dan büyük olan belgeleri bul ---")
query = {"age": {"$gt": 30}}
for document in collection.find(query):
print(document)
print("\n--- Yaşı 30'dan küçük veya eşit olan belgeleri bul ---")
query = {"age": {"$lte": 30}}
for document in collection.find(query):
print(document)
* Mantıksal Operatörler ($and, $or, $not, $nor):
* $and: Tüm koşulların doğru olması gerekir.
* $or: En az bir koşulun doğru olması gerekir.
print("\n--- Şehri 'New York' olan ve yaşı 30'dan küçük olan belgeleri bul ---")
query = {"$and": [{"city": "New York"}, {"age": {"$lt": 30}}]}
for document in collection.find(query):
print(document)
print("\n--- Adı 'Bob' veya 'Charlie' olan belgeleri bul ---")
query = {"$or": [{"name": "Bob"}, {"name": "Charlie"}]}
for document in collection.find(query):
print(document)
* Dizi Sorgulama ($in, $all, $size):
print("\n--- Hobileri arasında 'reading' olan belgeleri bul ---")
query = {"hobbies": "reading"} # Dizi içinde eleman arar
for document in collection.find(query):
print(document)
print("\n--- Hem 'reading' hem de 'hiking' hobisi olan belgeleri bul ($all) ---")
query = {"hobbies": {"$all": ["reading", "hiking"]}}
for document in collection.find(query):
print(document)
Tek Bir Belge Okuma (findOne())
find_one() metodu, belirli bir filtreye uyan ilk belgeyi döndürür. Eğer eşleşen belge yoksa None döndürür.
print("\n--- Tek Bir Belge Okuma (findOne) ---")
try:
query = {"name": "Bob"}
document = collection.find_one(query)
if document:
print(f"Bulunan belge: {document}")
else:
print("Eşleşen belge bulunamadı.")
query_not_found = {"name": "Zeynep"}
document_not_found = collection.find_one(query_not_found)
if document_not_found:
print(f"Bulunan belge: {document_not_found}")
else:
print("Eşleşen belge bulunamadı (Zeynep).")
except Exception as e:
print(f"Tek belge okunurken hata oluştu: {e}")
Sıralama, Limit ve Atlama (sort, limit, skip)
Sorgu sonuçlarını daha da özelleştirmek için zincirleme metotlar kullanılabilir.
* sort(): Sonuçları belirli bir alana göre sıralar. pymongo.ASCENDING (1) veya pymongo.DESCENDING (-1) kullanılır.
* limit(): Döndürülecek belge sayısını sınırlar.
* skip(): Belirli sayıda belgeyi atlar.
from pymongo import ASCENDING, DESCENDING
print("\n--- Yaşa göre sıralanmış ve ilk 2 belgeyi al ---")
for document in collection.find().sort("age", ASCENDING).limit(2):
print(document)
print("\n--- Şehre göre sıralanmış, ilk 1 belgeyi atlayıp sonraki 2 belgeyi al ---")
for document in collection.find().sort("city", DESCENDING).skip(1).limit(2):
print(document)
Projeksiyon (projection)
Belgelerden yalnızca belirli alanları döndürmek için projeksiyon kullanılır. Bu, ağ trafiğini azaltır ve performansı artırır. Projeksiyon sözlüğü, döndürülmesini istediğiniz alanlar için 1 ve istemediğiniz alanlar için 0 içerir. _id alanı varsayılan olarak döner, bunu hariç tutmak için açıkça 0 olarak belirtilmelidir.
print("\n--- Sadece isim ve yaş alanlarını göster (projeksiyon) ---")
_id alanı varsayılan olarak döner, hariç tutmak için "_id": 0 ekleyin
for document in collection.find({}, {"name": 1, "age": 1, "_id": 0}):
print(document)
print("\n--- Sadece isim ve şehir alanlarını göster, _id dahil ---")
for document in collection.find({}, {"name": 1, "city": 1}):
print(document)
3. Update (Güncelleme)
Mevcut belgelerin içeriğini değiştirmek için kullanılır. MongoDB, belgeleri güncellemek için çeşitli güncelleme operatörleri sağlar (örneğin $set, $inc, $unset).
Tek Bir Belge Güncelleme (updateOne)
update_one() metodu, belirli bir filtreye uyan ilk belgeyi günceller.
print("\n--- Tek Bir Belge Güncelleme (updateOne) ---")
try:
# Alice'in yaşını 31 olarak güncelle
query = {"name": "Alice"}
new_values = {"$set": {"age": 31, "status": "active"}} # $set operatörü ile alanları ayarla
result = collection.update_one(query, new_values)
print(f"Eşleşen belge sayısı: {result.matched_count}")
print(f"Güncellenen belge sayısı: {result.modified_count}")
# Güncellenen belgeyi kontrol et
print("Güncellenen Alice belgesi:")
print(collection.find_one(query))
# Upsert örneği: Belge yoksa ekle
print("\n--- Upsert ile belge güncelleme/ekleme ---")
query_upsert = {"name": "Eve"}
new_values_upsert = {"$set": {"age": 22, "city": "London"}}
result_upsert = collection.update_one(query_upsert, new_values_upsert, upsert=True)
print(f"Upsert ile eşleşen belge sayısı: {result_upsert.matched_count}")
print(f"Upsert ile güncellenen belge sayısı: {result_upsert.modified_count}")
if result_upsert.upserted_id:
print(f"Yeni belge eklendi. _id: {result_upsert.upserted_id}")
print("Upsert sonrası Eve belgesi:")
print(collection.find_one(query_upsert))
except Exception as e:
print(f"Tek belge güncellenirken hata oluştu: {e}")
update_one() metodu, UpdateResult nesnesi döndürür. matched_count sorguya uyan belge sayısını, modified_count ise gerçekten değiştirilen belge sayısını gösterir. upsert=True parametresi, sorguya uyan bir belge bulunamazsa yeni bir belge oluşturulmasını sağlar.
Birden Fazla Belge Güncelleme (updateMany)
update_many() metodu, belirli bir filtreye uyan tüm belgeleri günceller.
print("\n--- Birden Fazla Belge Güncelleme (updateMany) ---")
try:
# Yaşı 30'dan büyük olan tüm kişilerin statüsünü 'senior' olarak güncelle
query = {"age": {"$gt": 30}}
new_values = {"$set": {"status": "senior"}}
result = collection.update_many(query, new_values)
print(f"Eşleşen belge sayısı: {result.matched_count}")
print(f"Güncellenen belge sayısı: {result.modified_count}")
# Güncellenen belgeleri kontrol et
print("Yaşı 30'dan büyük olan güncellenmiş belgeler:")
for doc in collection.find(query):
print(doc)
except Exception as e:
print(f"Birden fazla belge güncellenirken hata oluştu: {e}")
Belgeyi Değiştirme (replaceOne)
replace_one() metodu, bir belgeyi tamamen yeni bir belgeyle değiştirmek için kullanılır (sadece _id alanı korunur).
print("\n--- Belgeyi Değiştirme (replaceOne) ---")
try:
# Bob'un belgesini tamamen yeni bir belgeyle değiştir
query = {"name": "Bob"}
replacement_document = {
"name": "Robert",
"age": 26,
"occupation": "Software Engineer",
"city": "San Francisco"
}
result = collection.replace_one(query, replacement_document)
print(f"Eşleşen belge sayısı: {result.matched_count}")
print(f"Değiştirilen belge sayısı: {result.modified_count}")
# Değiştirilen belgeyi kontrol et
print("Değiştirilen Robert belgesi:")
print(collection.find_one({"name": "Robert"}))
except Exception as e:
print(f"Belge değiştirilirken hata oluştu: {e}")
4. Delete (Silme)
Koleksiyonlardan belgeleri veya koleksiyonun kendisini silmek için kullanılır.
Tek Bir Belge Silme (deleteOne)
delete_one() metodu, belirli bir filtreye uyan ilk belgeyi siler.
print("\n--- Tek Bir Belge Silme (deleteOne) ---")
try:
# Adı 'Eve' olan belgeyi sil
query = {"name": "Eve"}
result = collection.delete_one(query)
print(f"Silinen belge sayısı: {result.deleted_count}")
# Silinen belgeyi kontrol et
print("Eve belgesi mevcut mu?")
print(collection.find_one(query)) # None dönmeli
except Exception as e:
print(f"Tek belge silinirken hata oluştu: {e}")
delete_one() metodu, DeleteResult nesnesi döndürür. deleted_count özelliği, silinen belge sayısını gösterir.
Birden Fazla Belge Silme (deleteMany)
delete_many() metodu, belirli bir filtreye uyan tüm belgeleri siler. Eğer boş bir filtre {} sağlanırsa, koleksiyondaki tüm belgeleri siler.
print("\n--- Birden Fazla Belge Silme (deleteMany) ---")
try:
# Yaşı 30'dan büyük olan tüm belgeleri sil
query = {"age": {"$gt": 30}}
result = collection.delete_many(query)
print(f"Silinen belge sayısı: {result.deleted_count}")
# Silinen belgeleri kontrol et
print("Yaşı 30'dan büyük olan belgeler mevcut mu?")
for doc in collection.find(query):
print(doc) # Hiçbir şey dönmemeli
except Exception as e:
print(f"Birden fazla belge silinirken hata oluştu: {e}")
Tüm belgeleri silmek için:
print("\n--- Tüm belgeleri silme ---")
result_all = collection.delete_many({})
print(f"Tüm belgeler silindi. Silinen belge sayısı: {result_all.deleted_count}")
Koleksiyonu Silme (drop)
Bir koleksiyonu tamamen silmek için drop() metodunu kullanabilirsiniz.
print("\n--- Koleksiyonu Silme (drop) ---")
try:
if "my_collection_name" in db.list_collection_names():
collection.drop()
print(f"'{collection.name}' koleksiyonu başarıyla silindi.")
else:
print(f"'{collection.name}' koleksiyonu zaten mevcut değil.")
except Exception as e:
print(f"Koleksiyon silinirken hata oluştu: {e}")
Veritabanını Silme (drop_database)
Bir veritabanını tamamen silmek için client.drop_database() metodunu kullanabilirsiniz.
print("\n--- Veritabanını Silme (drop_database) ---")
try:
# Veritabanının varlığını kontrol etmek için önce listeye bakalım
if "my_database_name" in client.list_database_names():
client.drop_database('my_database_name')
print(f"'{db.name}' veritabanı başarıyla silindi.")
else:
print(f"'{db.name}' veritabanı zaten mevcut değil.")
except Exception as e:
print(f"Veritabanı silinirken hata oluştu: {e}")
finally:
# Tüm işlemler bittikten sonra bağlantıyı kapatın
client.close()
print("MongoDB bağlantısı kapatıldı.")
Gelişmiş Konulara Kısa Bir Bakış
CRUD operasyonları MongoDB ile etkileşimin temelini oluştursa da, bu güçlü veritabanı çok daha fazlasını sunar. İşte PyMongo ile keşfedebileceğiniz bazı gelişmiş konular:
İndeksleme
Veritabanı sorgularının performansını artırmak için indeksler kritik öneme sahiptir. MongoDB, belirli alanlarda indeksler oluşturarak sorgu hızını önemli ölçüde artırabilir. PyMongo ile create_index() metodunu kullanarak indeksler oluşturabilirsiniz. Örneğin:
# collection.create_index("name") # Tek alan indeksi
collection.create_index([("age", ASCENDING), ("city", DESCENDING)]) # Bileşik indeks
Agregasyon Çerçevesi
MongoDB’nin agregasyon çerçevesi, veriler üzerinde karmaşık dönüşümler ve analizler yapmanızı sağlar. Bu, gruplama ($group), filtreleme ($match), sıralama ($sort) ve projeksiyon ($project) gibi aşamaları kullanarak veri boru hatları oluşturmanıza olanak tanır. PyMongo’da aggregate() metodunu kullanarak agregasyon boru hatlarını çalıştırabilirsiniz.
# pipeline = [
{"$match": {"status": "active"}},
{"$group": {"_id": "$city", "totalUsers": {"$sum": 1}}},
{"$sort": {"totalUsers": DESCENDING}}
]
for doc in collection.aggregate(pipeline):
print(doc)
İşlemler (Transactions)
MongoDB 4.0 ve sonraki sürümler, birden fazla belge veya koleksiyon üzerinde atomik işlemler (multi-document transactions) yapma yeteneği sunar. Bu, finansal işlemler gibi verilerin tutarlılığının kritik olduğu senaryolarda önemlidir. PyMongo, with client.start_session() as session: yapısı içinde session.start_transaction() ve session.commit_transaction() metotları ile işlemleri destekler.
Replica Setler ve Sharding
Yüksek erişilebilirlik ve ölçeklenebilirlik için MongoDB, replica setler (veri yedekliliği ve otomatik failover) ve sharding (veri dağıtımı) mimarilerini destekler. PyMongo, bu mimarilerle sorunsuz bir şekilde çalışabilir ve bağlantı dizesinde uygun seçenekleri belirterek bu özelliklerden faydalanabilir.
Sonuç
Bu makalede, Ubuntu 20.04 üzerinde MongoDB’yi kurmaktan başlayarak, PyMongo kütüphanesini kullanarak MongoDB’deki temel CRUD operasyonlarını (Create, Read, Update, Delete) adım adım nasıl gerçekleştireceğinizi öğrendik. Kurulum adımlarından, MongoDB sunucusuna bağlantı kurmaya, veritabanı ve koleksiyon seçimine kadar her aşamayı detaylıca inceledik.
Her bir CRUD operasyonu için PyMongo’nun sunduğu metotları (insertOne, insertMany, find, findOne, updateOne, updateMany, replaceOne, deleteOne, deleteMany, drop, drop_database) ayrıntılı örneklerle açıkladık. Ayrıca, sorguları daha verimli hale getirmek için karşılaştırma ve mantıksal operatörlerin nasıl kullanılacağını, sonuçları sıralama, limit koyma, atlama ve projeksiyon uygulama tekniklerini de gösterdik.
PyMongo, Python geliştiricilerine MongoDB ile güçlü ve esnek bir etkileşim imkanı sunar. Belge tabanlı yapısı ve şemasız doğası sayesinde, hızlı prototipleme ve çevik geliştirme süreçleri için idealdir. Bu makaledeki bilgileri kullanarak, kendi MongoDB tabanlı Python uygulamalarınızı geliştirmeye başlayabilir ve veri yönetim ihtiyaçlarınızı karşılayabilirsiniz.
Unutmayın ki MongoDB ve PyMongo’nun yetenekleri burada bahsedilen temel CRUD operasyonlarının çok ötesindedir. İndeksleme, agregasyon çerçevesi, işlemler ve ölçeklenebilirlik çözümleri gibi gelişmiş konuları keşfetmek, uygulamalarınızın performansını ve karmaşıklığını artırmak için size daha fazla güç katacaktır. Bu rehber, MongoDB ve PyMongo dünyasına sağlam bir başlangıç noktası sunmaktadır. Başarılar dileriz!