Resim

PyMongo ile Belge Bulmak

PyMongo ile Belge Bulmak

MongoDB'deki sorgulama işlemi, PyMongo'nun find_one() ve find() metotları aracılığıyla yapılır. Bu metotlar, SQL'deki SELECT ifadesinin karşılığıdır.

Sorgulamanın anahtarı, arama kriterlerini Python sözlükleri (dict) olarak tanımlamaktır.

Bağlantı ve Koleksiyon

Daha önceki adımlarda eklediğimiz verilerin bulunduğu kitaplar koleksiyonunu kullanacağız:

from pymongo import MongoClient

client = MongoClient('mongodb://localhost:27017/')
db = client['proje_db']
kitaplar_col = db['kitaplar'] 

1. Tek Bir Belge Bulma (find_one)

Eşleşen belgelerden yalnızca ilkini almak istediğinizde find_one() metodunu kullanırsınız. Bu metot doğrudan bir Python sözlüğü (bulunan belgeyi) veya eşleşme yoksa None döndürür.

Örnek: Yazar Adına Göre Bulmak

# Sorgu Kriteri: Yazar adı 'Ahmet Bilgin' olsun
sorgu_kriteri = {"yazar": "Ahmet Bilgin"}
kitap = kitaplar_col.find_one(sorgu_kriteri)
print("--- Tek Belge Sorgusu (find_one) ---")
if kitap:
    print(f"Bulunan Kitap Adı: {kitap['isim']}")
    print(kitap)
else:
    print("Kitap bulunamadı.")

2. Birden Çok Belge Bulma (find)

Filtreye uyan tüm belgeleri almak istediğinizde find() metodunu kullanırsınız. Bu metot, sorgu sonuçları üzerinde döngü kurmanızı sağlayan bir Yineleyici (Cursor) nesnesi döndürür.

Örnek: Yayınevine Göre Bulmak

# Sorgu Kriteri: Yayınevi 'Yazılım Kitapları A.Ş.' olsun
sorgu_kriteri = {"yayinevi": "Yazılım Kitapları A.Ş."}
# find() metodu bir yineleyici (cursor) döndürür
sonuclar = kitaplar_col.find(sorgu_kriteri)
print("\n--- Çoklu Belge Sorgusu (find) ---")
for kitap in sonuclar:
    # Her bir belgeyi tek tek işleriz
    print(f"Yazar: {kitap['yazar']}, Kitap: {kitap['isim']}")

3.Boş Sorgu: Tüm Belgeleri Alma

Kriter belirtmezseniz (yani boş bir sözlük {} geçirirseniz veya sözlük belirtmezsiniz.), koleksiyondaki tüm belgeleri alırsınız:

for kitap in kitaplar_col.find({}): veya for kitap in kitaplar_col.find():

# Koleksiyondaki tüm belgeleri getir
print("\n--- Tüm Belgeler ---")
for kitap in kitaplar_col.find():
    # Sadece isim ve ID'yi yazdıralım
    print(f"ID: {kitap['_id']}, İsim: {kitap['isim']}") 

4. Yalnızca Bazı Alanları Döndür

Bir find() veya find_one() sorgusu çalıştırdığınızda, MongoDB varsayılan olarak eşleşen belgenin tüm alanlarını döndürür. Eğer 20 alandan sadece 2 tanesine ihtiyacınız varsa, diğer 18 alanı taşımanın bir anlamı yoktur.

Bu optimizasyon tekniğine Projeksiyon (Projection) denir ve find() metodunun ikinci parametresi olarak bir Python sözlüğü (dict) ile uygulanır.

1. Projeksiyonun Temel Kuralı

Projeksiyon sözlüğünde, hangi alanları istediğinizi belirtmek için alan adına karşılık gelen değere 1 (göstermeyi aç) veya 0 (göstermeyi kapat) yazılır.

  • 1: Bu alanı göster.

  • 0: Bu alanı gösterme.

Örnek: Yalnızca İsim ve Yazar Alanlarını Gösterme

Daha önceki kitaplar koleksiyonumuzdan sadece isim ve yazar alanlarını çekelim.

# Tüm kitapları sorgula
sorgu_filtresi = {}
# Projeksiyon: Hangi alanları istiyoruz (isim: 1, yazar: 1)
projeksiyon = {"isim": 1, "yazar": 1}
sonuclar = kitaplar_col.find(sorgu_filtresi, projeksiyon)
print("--- Projeksiyon ile Sadece İsim ve Yazar ---")
for kitap in sonuclar:
    print(kitap)

2. _id Alanı Kuralı: Kapatılması Gereken Tek Alan

MongoDB, güvenlik ve benzersiz tanımlama nedeniyle, siz aksini belirtmedikçe _id alanını her zaman döndürür.

Eğer _id alanını da göstermek istemiyorsanız, bunu projeksiyon sözlüğünde açıkça belirtmeniz gerekir:

sorgu_filtresi = {}

# _id'yi kapatmak için 0 kullanılır
projeksiyon_id_kapali = {"isim": 1, "yazar": 1, "_id": 0} 
sonuclar = kitaplar_col.find(sorgu_filtresi, projeksiyon_id_kapali)
print("\n--- Projeksiyon ile _id'yi Kapatma ---")
for kitap in sonuclar:
    # Bu çıktıda _id alanı görünmeyecektir
    print(kitap) 

3. Alan Hariç Tutma (Exclude)

Projeksiyonda genellikle hangi alanları istediğinizi (1 ile) belirtirsiniz.

Kural: Aynı projeksiyon sözlüğünde hem 1 hem de 0 kullanılamaz, tek istisna _id'dir.

Eğer bir belgede çok sayıda alan varsa ve siz sadece bir veya iki alanı hariç tutmak istiyorsanız, diğer tüm alanlar otomatik olarak dahil edilir:

# Yazar hariç (0) tüm alanları getir
projeksiyon_yazar_haric = {"yazar": 0} 

print("\n--- Yazar Alanı Hariç Tutma ---")
for kitap in kitaplar_col.find({}, projeksiyon_yazar_haric):
    # 'yazar' alanı hariç diğer tüm alanlar (isim, yayinevi, yil, stok, _id) dönecektir.
    print(f"Kitap Adı: {kitap['isim']}, Yazar: HARIÇ TUTULDU") 

Yorumlar

Bu blogdaki popüler yayınlar

Python random Modülü

Yazılım Nedir?

Python print()