Ana içeriğe geç

MongoDB Query API'ye Başlangıç

Bu kapsamlı kılavuzla CRUD işlemleri, gelişmiş filtreler, veri toplulaştırma ve performansı artıran indeksleme üzerinden MongoDB Query API'yi ustalıkla öğrenin.
· 7 dk. oku

Yapay Zeka ile Keşfedin

Popüler bir NoSQL veritabanı olan MongoDB, verilerinizi yönetmek için esnek ve ölçeklenebilir bir yol sunar. Bu kılavuz, sezgisel Query API'sinin temellerini öğrenmeniz için başlangıç noktasıdır; bu API, verilerinizle basit bir BSON (Binary JSON) ile etkileşim kurmanıza olanak tanır ve verimlilik ile veri türleri için optimize edilmiştir. 

Bu makale boyunca temel oluşturma, okuma, güncelleme, silme (CRUD) işlemlerini ele alacak, filtreler ve projeksiyon ile hassas sorgulamaya inecek, veri dönüşümü için toplulaştırma (aggregation) hatlarının gücünü keşfedecek ve performansı artırmak için indekslemeden bahsedeceğiz. Sonunda, MongoDB koleksiyonlarınızda verileri verimli şekilde almak ve değiştirmek için sağlam bir temel edinmiş olacaksınız.

Temel Kavramlar: CRUD İşlemleri

Her veritabanı etkileşiminin omurgası CRUD'dur: oluşturma, okuma, güncelleme ve silme. MongoDB'de her birinin nasıl yapıldığını inceleyelim.

Veri oluşturma (insert)

Bir koleksiyona yeni dokümanlar eklemek için insert yöntemlerini kullanırsınız. MongoDB'de dokümanlar JSON benzeri nesnelerdir.

insertOne()

Bu yöntem, bir koleksiyona tek bir doküman eklemek için kullanılır.

// A sample document to insert
const newProduct = {
  name: "Wireless Mouse",
  brand: "Logitech",
  price: 29.99,
  inStock: true
};

// Insert the new document into the 'products' collection
db.products.insertOne(newProduct);

insertMany()

Bu yöntem, birden fazla dokümanı tek seferde ekler ve teker teker eklemekten çok daha verimlidir.

// An array of documents to insert
const newProducts = [
  { name: "Mechanical Keyboard", brand: "Corsair", price: 129.99, inStock: false },
  { name: "Gaming Headset", brand: "Razer", price: 99.99, inStock: true },
  { name: "Webcam", brand: "LogiTech", price: 79.99, inStock: true }
];

// Insert the array of documents into the 'products' collection
db.products.insertMany(newProducts);

Veri okuma (find)

find() yöntemi, bir koleksiyondan dokümanları getirmek için birincil aracınızdır. find() çağrıldığında, dokümanların tamamını hemen döndürmez. Bunun yerine bir imleç döndürür. Bu, büyük sonuç kümelerini bir seferde belleğe yüklemeden verimli şekilde işlemek için etkilidir.

En basit find() çağrısı argüman almaz ve koleksiyondaki her dokümana yönelik bir imleç döndürür.

// Find and return a cursor to all documents in the 'products' collection
db.products.find();

Bu imleç nesnesinin mongosh'ta (MongoDB kabuğu) nasıl göründüğüne ve onunla nasıl etkileşime girebileceğinize bir örnek:

// Find all products and assign the returned cursor to a variable
const productCursor = db.products.find();

// The variable 'productCursor' now holds the cursor object, not the documents themselves.
// To get the documents, you need to iterate over the cursor.

// You can convert the cursor to an array to see all the documents
const allProducts = productCursor.toArray();
console.log(allProducts);

// Or, you can manually iterate through the documents
while (productCursor.hasNext()) {
  const product = productCursor.next();
  console.log(product);
}

İmlecin kendisi, sonuç kümesindeki dokümanları almaya ve onlarla çalışmaya olanak tanıyan toArray(), hasNext() ve next() gibi çeşitli yöntemlere sahip bir nesnedir.

Veri güncelleme (update)

Mevcut dokümanları değiştirmek için update yöntemlerini kullanırsınız. Bu yöntemler iki ana argüman alır: güncellenecek dokümanları seçmek için bir filtre ve değişiklikleri belirtmek için bir güncelleme operatörü. Yaygın bir operatör, bir alanın değerini ayarlayan $set'tir.

updateOne()

Bu yöntem, filtreyle eşleşen ilk dokümanı günceller.

// Update the 'Wireless Mouse' document to set its price to 39.99
db.products.updateOne(
  { name: "Wireless Mouse" }, // Filter to find the document
  { $set: { price: 39.99 } } // Update operator
);

updateMany()

Bu yöntem, belirtilen filtreyle eşleşen tüm dokümanları günceller.

// Update all 'LogiTech' brand products to be in stock
db.products.updateMany(
  { brand: "LogiTech" }, // Filter to find the documents
  { $set: { inStock: true } } // Update operator
);

Veri silme (delete)

Dokümanları kaldırmak için delete yöntemlerini kullanırsınız. Bunlar da hangi dokümanların silineceğini belirlemek için bir filtre alır.

deleteOne()

Bu yöntem, filtreyle eşleşen ilk dokümanı kaldırır.

// Delete the 'Webcam' document
db.products.deleteOne({ name: "Webcam" });

deleteMany()

Bu yöntem, filtreyle eşleşen tüm dokümanları kaldırır. Bir koleksiyondaki tüm dokümanları silmek için boş bir filtre {} geçebilirsiniz.

// Delete all documents that are not in stock
db.products.deleteMany({ inStock: false });

Hassas Getirme: Sorgu Filtreleri

Sorgu filtreleri MongoDB'nin gücünün merkezindedir. find() ve update yöntemlerinde ilk argümandır ve üzerinde çalışmak istediğiniz dokümanları hassas şekilde seçmenizi sağlar.

Karşılaştırma operatörleri

Bu operatörler, bir alanın değerini belirtilen bir değerle karşılaştırmanızı sağlar.

$eq (eşittir)

Bu, bir alanın bir değere eşit olduğu dokümanları bulur.

// Find all products that are made by 'Razer'
db.products.find({ brand: { $eq: "Razer" } });
// This can be simplified to:
// db.products.find({ brand: "Razer" });

$gt ve $gte (büyüktür, büyük veya eşittir)

Bunlar, bir alanın değeri belirtilen değerden büyük ($gt) veya büyük ya da eşit ($gte) olduğu dokümanları bulur.

// Find all products with a price greater than 100
db.products.find({ price: { $gt: 100 } });

$lt ve $lte (küçüktür, küçük veya eşittir)

Bunlar, bir alanın değeri belirtilen değerden küçük ($lt) veya küçük ya da eşit ($lte) olduğu dokümanları bulur.

// Find all products with a price less than or equal to 50
db.products.find({ price: { $lte: 50 } });

$ne (eşit değildir)

$ne, bir alanın belirtilen bir değere eşit olmadığı dokümanları bulur.

// Find all products that are NOT made by 'LogiTech'
db.products.find({ brand: { $ne: "LogiTech" } });

$in ve $nin (dizi içinde, dizi içinde değil)

Bunlar, bir alanın değeri belirtilen değerler dizisi içinde ($in) veya içinde değil ($nin) olduğu dokümanları bulur.

// Find all products from 'Razer' or 'Corsair'
db.products.find({ brand: { $in: ["Razer", "Corsair"] } });

Mantıksal operatörler

Mantıksal operatörler, birden çok koşulu birleştirerek karmaşık sorgular oluşturur.

$and

$and, sorgu koşullarını mantıksal VE ile birleştirir. Tüm koşullar doğru olmalıdır.

// Find all products with a price greater than 50 AND are in stock
db.products.find({ $and: [{ price: { $gt: 50 } }, { inStock: true }] });
// This can be simplified by just listing the conditions:
// db.products.find({ price: { $gt: 50 }, inStock: true });

$or

Bu, sorgu koşullarını mantıksal VEYA ile birleştirir. En az bir koşul doğru olmalıdır.

// Find all products with a brand of 'Corsair' OR a price less than 40
db.products.find({ $or: [{ brand: "Corsair" }, { price: { $lt: 40 } }] });

Öğe ve değerlendirme operatörleri 

Bu operatörler, filtreleme için daha fazla esneklik sağlar.

$exists

$exists, belirli bir alanı içeren dokümanlarla eşleşir.

// Find all documents that have an 'inStock' field
db.products.find({ inStock: { $exists: true } });

$regex

Bu, metin alanlarında desen eşleştirme için düzenli ifadeler kullanmanıza olanak tanır.

// Find all product names that start with 'Wireless'
db.products.find({ name: { $regex: /^Wireless/ } });

Çıktınızı Biçimlendirme: Projeksiyon

Bir find() işlemi gerçekleştirirken, her dokümandaki alanların sadece bir alt kümesini almayı seçebilirsiniz. Buna projeksiyon denir ve find()'e geçilen ikinci argümandır. Aktarılan ve işlenen veri miktarını azaltmaya yardımcı olur.

Alanları dahil etme

Döndürülecek alanları değerlerini 1 yaparak belirleyebilirsiniz.

// Find all products and return only the 'name' and 'price' fields
db.products.find({}, { name: 1, price: 1 });

Alanları hariç tutma

Tersine, gizlenecek alanları değerlerini 0 yaparak belirleyebilirsiniz.

// Find all products and hide the 'inStock' field
db.products.find({}, { inStock: 0 });

_id alanı, siz açıkça hariç tutmadıkça varsayılan olarak her zaman döndürülür.

_id Alanı

_id alanını gizlemek için onu açıkça 0 olarak ayarlamalısınız.

// Find all products, returning only 'name' and 'price', and hiding '_id'
db.products.find({}, { _id: 0, name: 1, price: 1 });

Gelişmiş Veri Dönüşümü: Toplulaştırma Hatları

Toplulaştırma, MongoDB'de veri işleme için güçlü bir çerçevedir. Bir toplulaştırma hattı, dokümanları işleyen ve sonuçları bir aşamadan diğerine aktaran bir dizi aşamadan oluşur.

$match

Bir $match aşaması, tıpkı find()'da olduğu gibi bir sorgu filtresine göre dokümanları süzer. Genellikle işlenecek doküman sayısını azaltmak için ilk aşama olur.

// Find all products with a brand of 'LogiTech'
db.products.aggregate([
  { $match: { brand: "LogiTech" } }
]);

$group

$group aşaması, dokümanları belirtilen bir _id ifadesine göre gruplar ve bir alanın toplamı ya da ortalamasını hesaplamak gibi çeşitli biriktirici işlemler gerçekleştirebilir.

// Group products by brand and calculate the total number of products for each brand
db.products.aggregate([
  { $group: { _id: "$brand", totalProducts: { $sum: 1 } } }
]);

$project

Bir $project aşaması, find()'daki projeksiyona benzer şekilde akıştaki her dokümanı yeniden şekillendirir. Yeni alanlar ekleyebilir, mevcut olanları kaldırabilir ve verileri işleyebilirsiniz.

// Project a new field 'nameAndPrice' for each document
db.products.aggregate([
  { $project: { name: 1, price: 1, nameAndPrice: { $concat: ["$name", " (", "$price", ")"] } } }
]);

$sort

$sort aşaması, dokümanları belirtilen bir alana göre yeniden sıralar. Değer 1 artan, -1 azalan sıralamayı ifade eder.

// Sort all products by price in descending order
db.products.aggregate([
  { $sort: { price: -1 } }
]);

$limit ve $skip

Bu aşamalar sayfalama için kullanılır. $skip hattın başından itibaren belirtilen sayıda dokümanı atar, $limit ise bir sonraki aşamaya geçirilen doküman sayısını sınırlar.

// Skip the first 10 products and then return the next 5
db.products.aggregate([
  { $skip: 10 },
  { $limit: 5 }
]);

Basit bir hat örneği

Bu aşamaların birlikte nasıl çalıştığını gösteren eksiksiz bir örnek:

// Find the average price of all products that are currently in stock,
// grouped by brand.
db.products.aggregate([
  { $match: { inStock: true } }, // Filter for products in stock
  { $group: { _id: "$brand", averagePrice: { $avg: "$price" } } } // Group and calculate average price
]);

Performansı Artırma: İndeksleme

İndeksler, bir koleksiyonun verilerinin küçük ve kolayca dolaşılabilir bir bölümünü saklayan özel veri yapılarıdır. MongoDB'nin tüm koleksiyonu taramadan dokümanları hızla bulup getirmesine olanak tanıyarak sorgu performansını önemli ölçüde iyileştirirler.

createIndex()

Sık sorguladığınız veya sıraladığınız bir alan üzerinde indeks oluşturursunuz.

// Create a single-field index on the 'brand' field
db.products.createIndex({ brand: 1 });

1 değeri indeks için artan sıralamayı ifade eder. Sorgularınızın o yönde sıraladığı durumlarda faydalı olabilen azalan sıralama için -1 kullanabilirsiniz.

brand gibi bir alan üzerinde indeks oluşturmak, özellikle koleksiyonunuz büyüdükçe brand filtreli sorguların (örn. db.products.find({ brand: "Razer" })) çok daha hızlı çalışmasını sağlar.

İndekslenecek alanları seçerken dikkat edilecekler

Genellikle sorgularınızda sık kullandığınız alanlarda indeks oluşturmalısınız; örneğin bir find() filtresinde veya bir toplulaştırmanın $match aşamasında geçen alanlar gibi.

  • Kardinalite: Bir kullanıcının e-posta adresi gibi çok sayıda benzersiz değere (yüksek kardinalite) sahip alanlar indeks için mükemmel adaylardır.
  • Sorgu seçiciliği: Belirli bir sorgu için dokümanların küçük bir alt kümesini döndüren bir alan da harika bir adaydır.
  • Sıralama: Sorgu sonuçlarınızı belirli bir alana göre sıkça sıralıyorsanız, bu alan üzerinde indeks oluşturmak sıralama işlemini çok daha hızlı hale getirir.

Sorgular üzerindeki etkisi

İndeksler performans üzerinde büyük etkiye sahiptir. İndeksli bir sorgu, çoğu zaman aynı sorgunun indekssiz halinden katbekat daha hızlıdır.

// Conceptual illustration of performance difference

// Without an index on 'brand':
// MongoDB performs a full collection scan, checking every document.
// This is slow, especially with millions of documents.
db.products.find({ brand: "Razer" });

// With an index on 'brand':
// MongoDB uses the index to quickly locate and return only the matching documents.
// This is very fast.
db.products.find({ brand: "Razer" });

Sorguları daha da optimize etmek için, indekslerin nasıl kullanıldığını görmek ve sorgu performansını analiz etmek amacıyla db.collection.explain() yöntemini kullanabilirsiniz.

Sonuç: MongoDB Yetkinliğine Yolculuğunuz

MongoDB'nin Query API'sine hızlı bir giriş kursunu tamamladınız! Artık temel CRUD işlemlerini nasıl gerçekleştireceğinizi, belirli verileri getirmek için güçlü filtreleri nasıl kullanacağınızı, çıktınızı projeksiyonla nasıl şekillendireceğinizi ve verinizi toplulaştırma hatlarıyla nasıl dönüştüreceğinizi biliyorsunuz. Ayrıca performansı artırmak için indekslemeye dair temel bir anlayışa sahipsiniz.

Bu kılavuz sağlam bir temel sunar ve bu kavramlarda ustalaşmanın en iyi yolu pratik yapmaktır. Farklı sorgularla denemeler yapmanızı ve daha gelişmiş operatörler ile özellikleri keşfetmek için tam dokümantasyonu incelemenizi öneririm. İyi kodlamalar!

MongoDB Query API SSS

find() ve aggregate() arasındaki temel fark nedir?

find() yöntemi, isteğe bağlı filtreleme ve projeksiyon ile basit doküman getirme için kullanılır. aggregate() yöntemi ise çok aşamalı veri işleme için güçlü bir çerçevedir; dokümanları daha karmaşık biçimde dönüştürmenize, gruplamanıza, sıralamanıza ve yeniden şekillendirmenize olanak tanır. find() mevcut dokümanları okumak içinken, aggregate() verilerinizden yeni içgörüler türetmek içindir.

MongoDB neden find() işleminden gerçek dokümanlar yerine bir imleç döndürür?

Bir imleç, potansiyel olarak büyük sonuç kümelerini ele almak için verimli bir yoldur. MongoDB, tüm dokümanları bir seferde belleğe yüklemekten kaçınmak için bir imleç döndürür. Bu, özellikle milyonlarca dokümanla çalışırken performans ve ölçeklenebilirlik açısından kritik öneme sahiptir. İmleç, ihtiyaç duydukça sonuçlar üzerinde yineleme yapmanıza ve dokümanları partiler halinde getirmenize olanak tanır.

updateOne() ile updateMany() ne zaman kullanılmalı?

Yalnızca belirlediğiniz filtreyle eşleşen ilk dokümanı değiştirmeniz gerektiğinde updateOne() kullanın. Bu, benzersiz bir tanımlayıcıyla filtrelediğiniz ve yalnızca bir dokümanın eşleşmesini beklediğiniz senaryolar için idealdir. Filtre kriterlerini karşılayan tüm dokümanları güncellemek istediğinizde ise updateMany() kullanın.

İndeksler sorgu performansını nasıl iyileştirir?

İndeksler, bir koleksiyonun verilerinin küçük ve düzenli bir alt kümesini saklayan özel veri yapılarıdır. MongoDB'nin tüm koleksiyonu taramak zorunda kalmadan dokümanları hızla bulmasını sağlayarak sorguları önemli ölçüde hızlandırırlar. Veritabanı, her dokümanı tek tek kontrol etmek yerine indeksi kullanarak doğrudan eşleşen dokümanlara atlayabilir ve işlemi katbekat daha hızlı hale getirir.

Projeksiyonu toplulaştırma ile birlikte kullanabilir miyim?

Evet, projeksiyon toplulaştırma hattının kilit bir parçasıdır. $project aşaması dokümanları yeniden şekillendirmek, yeni alanlar eklemek veya mevcutları kaldırmak için kullanılır. Çoğu zaman $match veya $group gibi diğer aşamalardan sonra hattın çıktısını biçimlendirmek için kullanılır ve verilerinizin nihai yapısı üzerinde ince ayar imkânı sunar.

Karen Zhang

Yazar

Karen Zhang

Karen, ölçeklenebilir veri platformları kurma tutkusu olan bir Veri Mühendisidir. Terraform ile altyapı otomasyonu konusunda deneyime sahiptir ve öğrendiklerini blog yazıları ve eğitimlerde paylaşmaktan heyecan duyar. Karen bir topluluk geliştiricisidir ve veri profesyonelleri arasında bağlantılar kurmaya tutkuyla bağlıdır.

Konular

İlgili