MongoDB Veri Sorgulama (Querying) İşlemleri

  • 18.01.2018
  • M.Tayyip Yetiş
  • MongoDB

Herkese merhaba, uzun bir aradan sonra yeni bir makale yazmaya karar verdim. Bu sefer gündemimde olan bir konuyu değil arşivimden seçtiğim bir konuyu ele almak istedim. MongoDB ile ilgili önceki makalelerime buradan ulaşabilirsiniz. Önceki makalelerimde windows işletim sisteminde kurulumu ve çalıştırılması işlemlerini anlatmıştım artık bu NoSql veritabanının nimetlerinden faydalanmaya başlayabiliriz. 
Bu makaledeki işlemleri yapabilmek için MongoDB Server yazılımının ve RoboMongo Studio yazılımının bilgisayarınızda kurulu olması gerekiyor. Herşey hazırsa öğrenmeye başlayabiliriz.

Find (Filtreleme)

Dökümanlar üzerinde filtreleme işlemleri yapabilmenizi sağlar. Parametre olarak Json tipinde bir değer alır. SQL'deki Where komutuna benzetebilirsiniz.

db.getCollection('Products').find({})

Aşağıdaki gibi bir sonuç gelecektir.

{
    "_id" : 1,
    "Name" : "Samsung S7",
    "Price" : 2500.45,
    "Date" : ISODate("2017-07-03T08:00:00.000Z")
}

{
    "_id" : 2,
    "Name" : "Xiaomi Mi Band 2 Akıllı Bileklik Siyah",
    "Price" : 119.9,
    "Date" : ISODate("2017-09-15T08:00:00.000Z")
}

...

Aşağıdaki çeşitli filtreleme örneklerini inceleyebilirsiniz.

// fiyatı 100 lira olanlar
db.getCollection('Products').find({ Price: 100 });

// fiyatı 100 liradan büyük olanlar
db.getCollection('Products').find({ Price: { $gt: 100 }});

// fiyatı 100 liradan küçük olanlar
db.getCollection('Products').find({ Price: { $lt: 100 }})

//fiyatı 100 liradan büyük ve isminde "Samsung" değeri geçenler
db.getCollection('Products').find({ Price: { $gt: 100 }, Name : { $regex : "Samsung" } })

Sort (Sıralama)

Döküman üzerinde sıralama işlemi yapar. SQL dilindeki Order By komutuna benzetebilirsiniz.

// _id değerine göre büyükten küçüğe doğru sırala
db.getCollection('Products').find({}).sort({ _id: -1 })
// _id değerine göre küçükten büyüğe doğru sırala
db.getCollection('Products').find({}).sort({ _id: 1 })

// _id değerine göre küçükten büyüğe doğru, Price değerine göre küçükten büyüğe doğru sırala
db.getCollection('Products').find({}).sort({ _id: 1, Price: 1 })

Limit (Sonuç sayısı)

Döküman üzerindeki sorgulamalardan dönen sonuçları sınırlandırmanızı sağlar. SQL dilindeki TOP komutuna benzetebilirsiniz.

// ilk 2 sonucu getir
db.getCollection('Products').find({}).limit(2)

Skip (Atlama)

Döküman sorgusundan dönen sonuçlar üzerinde atlama yapabilmenizi sağlar. SQL dilinde direkt bir karşılığı yoktur diğer komutlar kullanarak yapılabilir.

db.getCollection('Products').find({}).skip(2)

Sonuç

{
    "_id" : 3,
    "Name" : "LG Q6 32 GB",
    "Price" : 1199.89,
    "Date" : ISODate("2018-01-15T08:00:00.000Z")
}
{
    "_id" : 4,
    "Name" : "Taç Tek Kişilik Spiderman Ultimate Nevresim Takımı",
    "Price" : 90.0,
    "Date" : ISODate("2017-04-23T08:00:00.000Z")
}
{
    "_id" : 5,
    "Name" : "Silver & Silver Zirkon Kar Tanesi Kolye",
    "Price" : 59.9,
    "Date" : ISODate("2017-03-13T08:00:00.000Z")
}

LookUp (Bir çeşit birleştirme)

İki döküman arasında birleştirme işlemi yapar. SQL dilindeki JOIN işlemine benzetebilirsiniz fakat farklılıklar vardır. Elimizde Products ve Categories isminde iki döküman olsun bu iki dökümanı birleştirip listelemek istersek Aggregate ve LookUp komutlarını kullanmamız gerekecek. Aggregate komutunu bir sonraki adımda göstereceğim.

Product dökümanımız aşağıdaki gibi olsun

{
    "_id" : 1,
    "Category" : 1,
    "Name" : "Samsung S7",
    "Price" : 119.9,
    "Date" : ISODate("2017-09-15T08:00:00.000Z")
}

Categories dökümanımız aşağıdaki gibi olsun.

{
    "_id" : 1,
    "Name" : "Elektronik"
}
{
    "_id" : 2,
    "Name" : "Giyim"
}

Aşağıdaki komutu inceleyin

db.Products.aggregate([
   {
     $lookup:
       {
         from: "Categories",
         localField: "Category",
         foreignField: "_id",
         as: "ProductWithCategories"
       }
  }
])

Sonuç:

{
    "_id" : 1,
    "Category" : 1.0,
    "Name" : "Samsung S7",
    "Price" : 119.9,
    "Date" : ISODate("2017-09-15T08:00:00.000Z"),
    "ProductWithCategories" : [ 
        {
            "_id" : 1,
            "Name" : "Elektronik"
        }
    ]
}
{
    "_id" : 2,
    "Name" : "Xiaomi Mi Band 2 Akıllı Bileklik Siyah",
    "Price" : 119.9,
    "Date" : ISODate("2017-09-15T08:00:00.000Z"),
    "ProductWithCategories" : []
}
{
    "_id" : 4,
    "Category" : 2.0,
    "Name" : "Samsung S7",
    "Price" : 119.9,
    "Date" : ISODate("2017-09-15T08:00:00.000Z"),
    "ProductWithCategories" : [ 
        {
            "_id" : 2,
            "Name" : "Giyim"
        }
    ]
}

Group (Gruplama)

Dökümanlar üzerinde gruplama işlemi yapmanızı sağlar. SQL dilindeki Group By işlemine benzetebilirsiniz. Aşağıda kategorilere göre fiyat ve adet toplamı yapan gruplama sorgusu yazılmıştır.

db.Products.aggregate(
   [
      {
        $group : {
           _id : "$Category",
           totalPrice: { $sum:  "$Price" },
           name:  { $first: "$Name" },
           count: { $sum: 1 }
        }
      }
   ]
)

Sonuç

{
    "_id" : 2,
    "totalPrice" : 523.2,
    "name" : "Guess GUW0377G4 Erkek Kol Saati",
    "count" : 1.0
}

{
    "_id" : 1.0,
    "totalPrice" : 3983.19,
    "name" : "Samsung S7",
    "count" : 2.0
}

Group ve LookUp operatörlerini kullanarak gruplandırılan kategorilerin isimlerini de yazdıralım.

db.Products.aggregate(
   [
      {
        $group : {
           _id : "$Category",
           totalPrice: { $sum:  "$Price" },
           name:  { $first: "$Name" },
           count: { $sum: 1 }
        }
      },
      {
         $lookup: {
           from: "Categories",
           localField: "_id",
           foreignField: "_id",
           as: "ProductWithCategories"
         } 
      }
   ]
)

Sonuç

{
    "_id" : 2,
    "totalPrice" : 523.2,
    "name" : "Guess GUW0377G4 Erkek Kol Saati",
    "count" : 1.0,
    "ProductWithCategories" : [ 
        {
            "_id" : 2,
            "Name" : "Giyim"
        }
    ]
}

{
    "_id" : 1,
    "totalPrice" : 3983.19,
    "name" : "Samsung S7",
    "count" : 2.0,
    "ProductWithCategories" : [ 
        {
            "_id" : 1,
            "Name" : "Elektronik"
        }
    ]
}

 

Umarım faydalı olmuştur. bir sonraki makalede görüşmek üzere.

Mustafa Tayyip Yetiş
Yazılım Geliştirme Uzmanı

Yorum Yap