12 Nisan 2021 Pazartesi

MongoDB Arama Listeleme ve Silme

    Bir önceki yazımda Mongodb'ye kısaca giriş yapmıştım ve bir tabloya veri eklemeyi yazmıştım. Bu günkü yazımda da kısaca tablomdaki kayıtları getirmeyi ve yapısı çok benzer olduğu için silme işlemini anlatacağım. Tekrar hatırlatayım. Yazdığım komutlar mongo ya consoldan direk olarak yollayabileceğiniz mongodb komutları. Eğer C#, java yada benzer bir dil üzerinden erişiyorsanız o dilde kullandığınız SDK yapısına uygun olarak komutları değiştirmeniz gerekir.

    MongoDB Arama (Find) komutu

    Mongoda arama ve listeleme için Find ve Aggregate komutlarından birisi kullanılır. aggregate komutu hem işlevi hem de kullanımı biraz karmaşık olduğu için daha sonra tek bir yazıda uzun uzun anlatmayı düşünüyorum. Bu yazıda find komutu ile bir kaç örnek kullanım göstereceğim. En basit kullanımı şöyledir. Yazdığım mongo komutlarının hemen altına Sql dillerindeki karşılığını yazmayı düşünüyorum. Böylece normal veri tabanları ile az çok haşır neşir olanlar daha hızlı anlayabilir.

db.collectionName.find({})

Sql: select * from collectionName

    Bu komut ismini verdiğiniz tablo içindeki tüm kayıtları döker. Hemen altında sql komutu karşılığından da  bunu anlayabilirsiniz. Eğer tablonuzda çok kayıt varsa bu komutu bu şekilde çalıştırmak biraz sıkıntı olabilir. Sonuna limit komutu ekleyerek daha az sayıda veriye göz atabilirsiniz. Skip komutu ile beraber kullanarak sayfalama yapısı da kullanabilirsiniz. Personel adında bir collection olduğunu farz ederek örneklerimi biraz daha somut hale getireyim. 

db.personel.find({}).limit(100) //sadece ilk 100 kaydı getirecektir
Sql : select top 100 * from personel -- veya select * from personel limit 100

db.personel.find({}).skip(200).limit(100) // ilk 200 kaydı atlayacak sonraki 100 kaydı getirecektir.
sql: select * from personel limit 100 offset 200

    Sorgumuza birde where koşulu eklememiz gerekirse find içinde tanımlayabiliriz.

db.personel.find({_id:"564"})  //564 id'li personeli getir.
sql: select * from personel where id = '564'

db.personel.find({maas:{$gte:3000}}) //maaşı 3000 ve üzeri olan personelleri getir.
sql: select * from personel where maas>=3000

db.personel.find({maas:{$lt : 3000}}) //maaşı 3000 den az personelleri getir.
sql: select * from personel where maas<3000

db.personel.find({
    dogumtarihi: {$gte:new Date("1980-01-01"), $lte:new Date("2000-01-01)}
})
//1980 den sonra 2000 den önce doğan personelleri getir.
sql: select * from personel where dogumtarihi between '1980-01-01' and '200-01-01'

db.personel.find({ad:"fatih" , soyad:"abc"}) //adı fatih, soyadı abc olan personelleri getir
db.personel.find({$and : [{ad:"fatih"} ,{ soyad:"abc"}] }) //adı fatih, soyadı abc olan personelleri getir
not: iki kullanımda and operatörü yerine geçer ve aynı sonucu döndürür.
sql: select * from personel where ad = 'fatih' and soyad = 'abc'

db.personel.find({$or: [{ad:"fatih"} ,{ ad:"ali"}] })//adı fatih veya ali olan personelleri getir
sql: select * from personel where ad = 'fatih' or ad = 'ali'

    Bu şekilde çekeceğiniz sorgu ya göre sql sorgularında where bölümüne koşul eklediğini gibi mongo içinde find içine istediğiniz kadar koşul ekleyebiliyorsunuz. 


    MongoDB Silme (DeleteOne, DeleteMany) komutu

    Mongoda silme yani delete işlemi aynı find komutu gibi yapılır. Find komutunda sorgunuzun sonucunda değerler size listelenir ama delete komutunda koşula uyan değerleriniz veri tabanından silinir. İki tane delete komutu vardır. 

  • DeleteOne : Koşulunuza uyan belgelerden ilki silinir.
  • DeleteMany: Koşulunuza uyan tüm belgeler silinir.
Örnek kullanım şu şekildedir. 
db.personel.deleteone({_id:"564"}) // 564 idli personel silinir.
sql:delete from personel where id = '564' //sql de bu komut deletemany gibi çalışır.

db.personel.deletemany({ad:"fatih"}) //fatih ismindeki tüm personeller silinir.
sql: delete from personel where ad = 'fatih' 

    Bu şekilde find içinde kullandığınız tüm şekillerde karmaşık koşullar ekleyerek istediğiniz kaydı silebilirsiniz.



11 Nisan 2021 Pazar

MongoDB Collection InsertOne ve InsertMany

    Bu aralar MongoDB veri tabanı ile çok haşır neşir olduğum için biraz yazmak istedim. Bu konuda internette büyük ihtimal 300 bin tane yazı vardır ama bir tanede benden olsun. Aslında dizi haline getirmeyi düşündüğüm ve muhtemelen pek fazla kişinin okumayacağı bu yazıları en çok kendim için yazıyorum. Çünkü işime yaradığında sağdan soldan toplayıp birleştirip sorun çözdüğüm kodları unutuyorum. Sonradan lazım olunca yine aynı şekilde toplamak zorunda kalıyorum. Bu yüzden buraya yazarak lazım olunca yine kullanmayı planlıyorum.

    Mongo nedir, Nosql nedir, veri tabanı nedir paragrafları açıp uzun uzun anlatmaya gerek yok sanırım. Zaten NoSql camiasının lokomotiflerinden olan Mongo belge (doküman) bazlı bir veri tabanıdır. Yani tablo (collection) içine attığınız her her kayıt bir doküman olarak saklanır ve bu şekilde kullanılır. Bir id değeri ile işaretlenir.

    Mongodb'yi mongodb.com adresinden indirip kurabilirsiniz. Bağlanmak için ücretli ve ücretsiz çeşitli arayüz programları kullanabilirsiniz. ben mongodbmanager.com sitesinden indirdiğim nosql manager programını kullanıyorum. Ücretsiz ve ücretli versiyonu var. Ayrıca sdk paketleri ile neredeyse tüm programlama dillerinden bağlanarak kullanabiliyorsunuz. Arayüzler üzerinden veri ekleme ve basit listeleme ve güncelleme işlemlerini yapabiliyorsunuz. Bu kısmı anlatmaya gerek yok ben mongo sorguları ile yapılacak işlemleri anlatacağım. Belki arada C# dilinden linq kullanımı da anlatırım. 


    Collection Oluşturma ve Veri Ekleme 

    MongoDB'de sabit bir veri yapısı zorunlu olmadığı için collection oluşturmak için özel bir komut çalıştırmanıza gerek yoktur. Eğer bir collection ismi vererek bir kayıt eklerseniz eğer collection varsa kaydı içine ekleyecek yoksa yeni bir collection oluşturacak ve kaydı onun içine ekleyecektir. Kayıt ekleme kodu InsertOne veya InsertMany komutları kullanılır.  Mesela Personel adlı bir collection'a yeni bir kayıt eklemek için;

db.Personel.InsertOne({
    "Ad":"Fatih",
    "Soyad":"Abc",
    "DogumTarihi":ISODate("1900-10-01T00:00:00.000Z"),
     "Sicil":1234

})

Belgeleri json formatında olması gerekiyor.Json belgenize _id alanı ve değeri eklerseniz bu belgenizin id'si olacaktır. Eğer id değeri vermezseniz mongodb kendisine özel olan  ObjectId formatında bir değer oluşturacak ve belgeye ekleyecektir. koleksiyona aynı sorguda birden fazla değer eklemek için InsertMany aşağıdkai şekilde komutu kullanılabilir. 

db.Personel.InsertMany([{
    "Ad":"Fatih",
    "Soyad":"Abc",
    "DogumTarihi":ISODate("1900-10-01T00:00:00.000Z"),
     "Sicil":1234

},
{
    "Ad":"Ali",
    "Soyad":"Abc",
    "DogumTarihi":ISODate("1900-10-01T00:00:00.000Z"),
     "Sicil":1234,
    "Maas":1234.67
},
{
    "_id":"6072214beb7726f28265870d",
    "Ad":"Ayşe",
    "Soyad":"Abc",
    "DogumTarihi":ISODate("1900-10-01T00:00:00.000Z"),
     "Sicil":1234
}]
)

Mongodb NoSql sistemlerin doğası gereği şema bağımsızdır. yani aynı koleksiyonda olsa bile tüm belgeler farklı tipte ve isimde alanlara sahip olabilirler. Mesela örneğimizde ilk kayıtta 4 alan varken ikinci kayıtta 5 alan var. İçerdeki kayıtların nasıl olacağı tamamen sizin programlarınızdaki ihtiyacınızla sınırlı. İsterseniz normal veri tabanları gibi koleksiyon içindeki tüm kayıtları aynı formatta saklarsınız isterseniz her belge içinde farklı formatlar saklarsınız. Tabi veriler kullanırken içinden çıkabilecekseniz :) 

Koleksiyon içine atabileceğiniz veriler json formatındaki veri tipleri ve özel bir kaç tipi içeriyor. Özel tip olarak en çok kullanacağınız ObjectId, Date, UUID tipleridir. Ayrıca iç içe dökümanlar ve arraylar ile istediğiniz formatta veri saklayabilirsiniz.