VERİTABANINDAKİ DÖKÜMANLARIN SIRALANMASI - SORT() METODU
Sıralama işlemi bilgisayar ortamlarında belki de en çok kullanılan işlemdir. Sıralama (sorting) denilince verilerin belli alanlara göre küçükten büyüğe ya da a’dan z’ye (Artan Sıralama - Ascending) ya da büyükten küçüğe veya z’den a’ya (Azalan sıralama - Descending) düzene sokulmasını anlıyoruz.
MongoDB’de sort() metodu her iki türde sıralamayı da gerçekleştirebilir. sort() metodunun yazılış biçimi,
sort({Anahtar:SıralamaTürü})
şeklindedir. Sıralama türü parametresi,
1 ise Artan (ascending)
-1 ise Azalan (descending)
türde sıralama söz konusudur.
ÖRNEK:
Önce urun adlı veritabanımızı aktif hale getirerek, içindeki tx tablosunun içeriğini görüntüleyelim:
> use urun
switched to db urun
> db.tx.find().pretty()
{
"_id" : ObjectId("5406280df13cf7fb97cab70d"),
"a" : 300,
"b" : 67,
"c" : 456,
"d" : 800,
"e" : 89
}
{
"_id" : ObjectId("54062834f13cf7fb97cab70e"),
"a" : 30,
"b" : 65,
"c" : 416,
"d" : 807,
"e" : 189
}
{
"_id" : ObjectId("5406285bf13cf7fb97cab70f"),
"a" : 230,
"b" : 765,
"c" : 4316,
"d" : 807,
"e" : 789
}
Şimdi tx koleksiyonunu “a” alanine göre artan (ascending) biçimde sıralamak istiyoruz. Buna göre aşağıdaki komutu girmeliyiz:
db.tx.find().sort({"a":1}).pretty()
Bu durumda aşağıdaki çıktı elde edilecektir:
{
"_id" : ObjectId("54062834f13cf7fb97cab70e"),
"a" : 30,
"b" : 65,
"c" : 416,
"d" : 807,
"e" : 189
}
{
"_id" : ObjectId("5406285bf13cf7fb97cab70f"),
"a" : 230,
"b" : 765,
"c" : 4316,
"d" : 807,
"e" : 789
}
{
"_id" : ObjectId("5406280df13cf7fb97cab70d"),
"a" : 300,
"b" : 67,
"c" : 456,
"d" : 800,
"e" : 89
}
Görüldüğü gibi tx koleksiyonu içindeki dökümanlar “a” alanına göre küçükten büyüğe doğru sıralanmıştır (30, 230, 300).
Şimdi aynı koleksiyonu büyükten küçüğe doğru (azalan - descending) tarzda sıralamak isteyelim. Buna göre aşağıdaki komutu girmeliyiz:
db.tx.find().sort({“a":-1}).pretty()
Bu komut sonucunda elde edilecek çıktı ise aşağıda verilmiştir:
{
"_id" : ObjectId("5406280df13cf7fb97cab70d"),
"a" : 300,
"b" : 67,
"c" : 456,
"d" : 800,
"e" : 89
}
{
"_id" : ObjectId("5406285bf13cf7fb97cab70f"),
"a" : 230,
"b" : 765,
"c" : 4316,
"d" : 807,
"e" : 789
}
{
"_id" : ObjectId("54062834f13cf7fb97cab70e"),
"a" : 30,
"b" : 65,
"c" : 416,
"d" : 807,
"e" : 189
}
>
Kolayca görüldüğü gibi bu kez tx koleksiyonu “a” alanına göre azalan sırada (300, 230, 30) sıralanmıştır.
BİRDEN FAZLA ANAHTARA GÖRE SIRALAMA
Pratikte en çok ihtiyaç duyulan uygulamalardan biri de, dökümanların birden fazla alana göre sıralanmalarıdır. Örneğin, personel bilgisini maaşa göre sıralamak ama maaşı aynı olanları da kendi aralarında yaşa göre sıralamak!
Bu işlem de MongoDB’de sort() metodu sayesinde kolayca gerçekleştirilebilir. Şimdi urun adlı veritabanımızın tx koleksiyonuna bu bilgiyi test edebileceğimiz veriler yükleyelim:
> db.tx.insert({"a":230,"b":75,"c":436,"d":807,"e":789})
WriteResult({ "nInserted" : 1 })
> db.tx.insert({"a":230,"b":5,"c":8436,"d":807,"e":789})
WriteResult({ "nInserted" : 1 })
> db.tx.insert({"a":230,"b":345,"c":8436,"d":807,"e":789})
WriteResult({ "nInserted" : 1 })
> db.tx.insert({"a":30,"b":34,"c":8436,"d":807,"e":789})
WriteResult({ "nInserted" : 1 })
> db.tx.insert({"a":30,"b":347,"c":8436,"d":807,"e":789})
WriteResult({ "nInserted" : 1 })
> db.tx.insert({"a":30,"b":7,"c":8436,"d":807,"e":789})
WriteResult({ "nInserted" : 1 })
tx koleksiyonunun son durumu aşağıdadır:
> db.tx.find()
{ "_id" : ObjectId("5406280df13cf7fb97cab70d"), "a" : 300, "b" : 67, "c" : 456, "d" : 800, "e" : 89 }
{ "_id" : ObjectId("54062834f13cf7fb97cab70e"), "a" : 30, "b" : 65, "c" : 416, "d" : 807, "e" : 189 }
{ "_id" : ObjectId("5406285bf13cf7fb97cab70f"), "a" : 230, "b" : 765, "c" : 4316, "d" : 807, "e" : 789 }
{ "_id" : ObjectId("5406b40af13cf7fb97cab710"), "a" : 230, "b" : 75, "c" : 436, "d" : 807, "e" : 789 }
{ "_id" : ObjectId("5406b41bf13cf7fb97cab711"), "a" : 230, "b" : 5, "c" : 8436, "d" : 807, "e" : 789 }
{ "_id" : ObjectId("5406b42ef13cf7fb97cab712"), "a" : 230, "b" : 345, "c" : 8436, "d" : 807, "e" : 789 }
{ "_id" : ObjectId("5406b443f13cf7fb97cab713"), "a" : 30, "b" : 34, "c" : 8436, "d" : 807, "e" : 789 }
{ "_id" : ObjectId("5406b452f13cf7fb97cab714"), "a" : 30, "b" : 347, "c" : 8436, "d" : 807, "e" : 789 }
{ "_id" : ObjectId("5406b45df13cf7fb97cab715"), "a" : 30, "b" : 7, "c" : 8436, "d" : 807, "e" : 789 }
Şimdi tx koleksiyonunu önce “a” anahtarına göre artan sırada, aynı “a” değerine sahip olanları da kendi aralarında “b” alanına göre sıralamak istiyoruz; bunun için aşağıdaki sort komutunu girmeliyiz:
> db.tx.find({},{"a":1,"b":1}).sort({"a":1,"b":1})
Sonuçta aşağıdaki çıktıyı elde edeceksiniz:
{ "_id" : ObjectId("5406b45df13cf7fb97cab715"), "a" : 30, "b" : 7 }
{ "_id" : ObjectId("5406b443f13cf7fb97cab713"), "a" : 30, "b" : 34 }
{ "_id" : ObjectId("54062834f13cf7fb97cab70e"), "a" : 30, "b" : 65 }
{ "_id" : ObjectId("5406b452f13cf7fb97cab714"), "a" : 30, "b" : 347 }
{ "_id" : ObjectId("5406b41bf13cf7fb97cab711"), "a" : 230, "b" : 5 }
{ "_id" : ObjectId("5406b40af13cf7fb97cab710"), "a" : 230, "b" : 75 }
{ "_id" : ObjectId("5406b42ef13cf7fb97cab712"), "a" : 230, "b" : 345 }
{ "_id" : ObjectId("5406285bf13cf7fb97cab70f"), "a" : 230, "b" : 765 }
{ "_id" : ObjectId("5406280df13cf7fb97cab70d"), "a" : 300, "b" : 67 }
>
Yukardaki çıktı dikkatle izlenirse, aşağıdaki tabloda verilen türde bir sıralama yapıldığı kolayca görülür:
“a” |
“b” |
---|---|
30 |
7 |
30 |
34 |
30 |
65 |
30 |
347 |
230 |
5 |
230 |
75 |
230 |
345 |
230 |
765 |
300 | 67 |
MongoDB - İNDEKSLEME (INDEXING)
MongoDB’de sıralama işlemi çok faydalıdır ancak büyük miktarda veri ile çalışıldığında her seferinde veriyi bir anahtara göre düzene sokmak oldukça zaman alıcı bir işlemdir.
Bunun yerine veriyi önceden hazırlanan bir veri yapısı ile bir mekanizma ile her seferinde sıra ile dolaşmayı sağlamak daha etkin bir metottur. Veriyi belli bir alana göre sıra ile dolaşmayı sağlayan ve başlangıçta bir kere hazırlanan bu veri yapısına indeks dosyası (index file) adı verilir.
MongoDB’de bu işlem ensureIndex() metodu yardımı ile gerçekleştirilir.
Şimdi urun veri tabanında tx koleksiyonuna bu metodu uygulayalım:
> db.tx.ensureIndex({"a":1})
{ "numIndexesBefore" : 5, "note" : "all indexes already exist", "ok" : 1 }
>
Bu işlemden sonra find ile yapılacak sorgulamalar ya da sort işlemleri çok daha hızlı hale gelecektir.