Yazılım Mimarileri ve Tasarım Desenleri Üzerine

NoSQL – MongoDB İşlevsel Fonksiyonlar ve Aggregate Operatörleri

Merhaba,

Klasik olarak veritabanından elde edilen veriler üzerinde belli başlı işlemleri NoSQL sistemlerinde de uygulayabilmekteyiz. Bu içeriğimizde MongoDB veritabanında barındırılan veriler üzerinde sıralama, limit belirleme vs. gibi sıradan işlevlerle beraber $group, $lookup vs. gibi aggregate operatörleri ile elde edilen verilerin daha farklı modifiyeler sağlanarak nasıl anlamlandırılabileceğini inceliyor olacağız.

İçeriğimizde örneklendirme aşamasında model olarak;

const mongoose = require("mongoose");
 
module.exports = mongoose.model("Employees", new mongoose.Schem a({
    _id: Number,
    userName: String,
    name: String,
    surName: String,
    age: Number
}));

router yapısı olarak;

const express = require("express");
const router = express.Router();
router.get("/", (request, response, next) => {
    response.send("Merhaba dünya...");
});
module.exports = router;

ve ana modül olarak;

const express = require("express");
const app = express();
const mongoose = require("mongoose");
mongoose.connect("mongodb://localhost/companydb")
    .then(() => console.log("Veritabanı bağlantısı başarıyla sağlanmıştır..."))
    .catch(error => console.log("Veritabanına bağlantı oluşturulurken beklenmeyen bir hatayla karşılaşıldı...", error.message));
const employeeRouter = require("./routers/employeeRouter");
app.use("/employee", employeeRouter);
app.listen(5000);

yapılarını kullanacak ve bunlardan route yapısında çalışacağımızı baştan bildirmekte fayda görüyorum.

Sıralama(sort)

Belirtilen kolona göre verileri sıralamaktadır. Klasik SQL’de ki “Order By” komutana karşılık gelmektedir. Sayısal tipte kolonlarda büyüklük-küçüklük kıyaslaması yaparken metinsel kolonlarda alfabetik sıralama gerçekleştirmektedir.

const express = require("express");
const router = express.Router();
const employeeModel = require("../models/employee");
router.get("/", (request, response, next) => {
    employeeModel.find({}, (error, data) => {
        if (!error)
            response.json(data);
        else
            response.send("Beklenmeyen bir hata ile karşılaşıldı.", error.message);
    }).sort({ "_id": -1 });
});
module.exports = router;

Dikkat ederseniz eğer belirtilen “_id” kolonuna “-1” değeri veirlmiştir. Bu değer sayısal olarak büyükten küçüğe, metinsel olarakta z’den a’ya anlamını ifade etmektedir. Eğer ki tam tersi bir sıralama isteniyorsa “1” değeri verilmesi yeterlidir.

const express = require("express");
const router = express.Router();
const employeeModel = require("../models/employee");
router.get("/", (request, response, next) => {
    employeeModel.find({}, (error, data) => {
        if (!error)
            response.json(data);
        else
            response.send("Beklenmeyen bir hata ile karşılaşıldı.", error.message);
    }).sort({ "name": 1, "_id": -1 });
});

module.exports = router;

Birden fazla kolonda sıralama yapmak istenirse yukarıdaki gibi çalışılabilmektedir. Burada önce “name” kolonuna göre a’dan z’ye ardından “_id” kolonuna görede büyükten küçüğe bir sıralama gerçekleştirilmiştir.

Limit Belirleme(limit)

Eldeki veri listesinin en baştaki verisinden belirtilen adet kadar veriyi getirecektir. Klasik SQL’de ki “Top n” komutuna karşı gelmektedir.

const express = require("express");
const router = express.Router();
const employeeModel = require("../models/employee");
router.get("/", (request, response, next) => {
    employeeModel.find({}, (error, data) => {
        if (!error)
            response.json(data);
        else
            response.send("Beklenmeyen bir hata ile karşılaşıldı.", error.message);
    }).limit(2);
});
module.exports = router;

Atlama(skip)

Veri listesinin başından belirtilen değer kadar veriyi görmemezlikten gelecek gerisini getirecektir.

const express = require("express");
const router = express.Router();
const employeeModel = require("../models/employee");
router.get("/", (request, response, next) => {
    employeeModel.find({}, (error, data) => {
        if (!error)
            response.json(data);
        else
            response.send("Beklenmeyen bir hata ile karşılaşıldı.", error.message);
    }).skip(2);
});
module.exports = router;

Aggregate Operatörleri

MongoDB’de aggregate operatörleri klasik SQL’de ki “aggregate” fonksiyonlarıyla aynı özellikleri barındırmakta ve orada hangi mantıkta hangi durumlarda kullanılıyorsa burada da aynı mantık ve durumlar için kullanılan, aradaki tek farkın oradakinin fonksiyon buradakinin ise operatör olması olan işlevlerdir.

Aggregate parametrelerini kullanabilmek için model üzerinden aggregate fonksiyonunu çağırmalısınız. Birazdan göreceğimiz tüm operatörler için aşağıdaki yapısal durumu genelleyerek zihninizde oturtmanız sizler için yapıların kullanımına dair oldukça kolaylık sağlayacaktır.

    model.aggregate([
        {
            [$parametre]: {
                [...işlemler...]
            }
        }
    ], (error, data) => {

    });

Yukarıdaki prototipi incelerseniz “aggregate” fonksiyonu içerisinde bir dizi oluşturulmakta ve kullanılacak operatör bu dizi içerisinde yaratılmış bir object içerisinde çağrılmaktadır. Aynı şekilde operatörde işlevselliği için bir başka object’e ihtiyaç duymakta ve tüm işlemler en alttaki objede gerçekleştirilmektedir. Tüm parametreler bu iskelette kullanıldığından dolayı bu yapıyı genelleyebilirsiniz.

İlgilenenlerin faydalanması dileğiyle…

Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Mobil sürümden çık