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

Node.js – MongoDB CRUD İşlemleri

Merhaba,

Bu içeriğimizde Node.js ortamında MongoDB’ye CRUD işlemlerinin nasıl yapıldığını ele alacağız. İlk olarak bir adet Node.js projesi inşa ediyoruz ve ardından projeye gerekli paketleri(express, mongoose vs.) entegre ediyoruz.

İçeriğimizde yapacağımız tüm örneklendirmeleri aşağıdaki uygulama çerçevesinde ele alacağız.

const mongoose = require("mongoose");
const express = require("express");
const app = express();

mongoose.connect("mongodb://localhost/companydb")
    .then(() => console.log("Veritabanı bağlantısı başarıyla sağlanmıştır..."))
    .catch(error => console.log("Veritabanı bağlantısı sağlanırken beklenmeyen bir hatayla karşılaşıldı...", error.message));

const employeeRoter = require("./routes/employeeRouter");
app.use("/employee/", employeeRoter);

app.listen(5000, () => console.log("Yayın başladı..."));

Ve ayriyetten makale boyunca kullanacağımız modülümüz aşağıdaki olacaktır.

const mongoose = require("mongoose");

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

Kayıt Ekleme

MongoDB’ye veri eklemeyi önceki Node.js – MongoDB’ye Mongoose İle Şema Oluşturma ve Kayıt Ekleme başlıklı yazımızda incelemiştik.

Tekrardan değinmemiz gerekirse eğer;

const express = require("express");
const router = express.Router();

const model = require("../models/employee");

router.get("/addEmployee", (request, response, next) => {
    let employee = new model({
        _id: 3,
        userName: "abc",
        name: "X",
        surName: "Y",
        age: 35
    });

    employee.save((error, data) => {
        if (error) {
            response.send("Beklenmeyen bir hatayla karşılaşıldı...");
        } else {
            response.json(data);
        }
    });
});

module.exports = router;

görüldüğü üzere “save” fonksiyonu ile veritabanına ilgili documenti kaydedebilmekteyiz.

Sorgu Oluşturmak(Find)

Veritabanındaki herhangi bir collectiondaki verilerin tümünü ya da şarta bağlı bir kısmını elde etmek için “find”, “findOne” ya da “findById” fonksiyonlarını aşağıdaki durumlarda kullanabiliriz.

Veri Güncelleme

Veri güncellemek için “update” fonksiyonu kullanılmaktadır.

const express = require("express");
const router = express.Router();

const model = require("../models/employee");

router.get("/updateEmployee", (request, response, next) => {
    model.update({ name: "Gençay" }, { surName: "Yıldız (Yeni)" }, (error, data) => {
        if (error) {
            response.send("Beklenmeyen bir hatayla karşılaşıldı...");
        }
        else {
            response.json(data);
        }
    });
});
module.exports = router;

Yukarıdaki kod bloğunu incelerseniz eğer; “name” kolonu “Gençay” olan verinin “surName” kolonunu “Yıldız (Yeni)” yap! demekteyiz. Burada dikkat ederseniz şarta uyan tüm veriler için çoğul değil, tekil bir tarifte bulunmuş bulunmaktayım. Bunun sebebi, “update” fonksiyonu bu şekilde kullanıldığında sadece şarta uyan ilk veride ilgili işlemi uygulamaktadır.

Eğer ki şarta uyan tüm verilerde update işlemini uygulamak istiyorsanız sorguya “multi : true” değerini aşağıdaki gibi belirtmeniz gerekmektedir.

const express = require("express");
const router = express.Router();

const model = require("../models/employee");

router.get("/updateEmployee", (request, response, next) => {
    model.update({ name: "Gençay" }, { surName: "Yıldız (Yeni)" }, { multi: true }, (error, data) => {
        if (error) {
            response.send("Beklenmeyen bir hatayla karşılaşıldı...");
        }
        else {
            response.json(data);
        }
    });
});
module.exports = router;

Bu şekilde güncelleme işlemi yaptığımız taktirde şarta uyan tüm veriler etkilenecektir.

Upsert Anahtar Kelimesi
Yapacağımız güncelleme işlemlerinde eğer ki şarta uygun veri varsa ilgili işlemi icra edebiliriz. Ya yoksa! ve böyle bir durumda olmayan veriyi kaydetmek istiyorsak! Evet… Bu işlemi kontrollerle sağlayabiliriz lakin Upsert keywordü tam da bu ihtiyaca istinaden üretilmiş bir işlevselliğe sahiptir.

const express = require("express");
const router = express.Router();

const model = require("../models/employee");

router.get("/updateEmployee", (request, response, next) => {
    model.update({ name: "Gençay" }, { surName: "Yıldız (Yeni)" }, { upsert: true }, (error, data) => {
        if (error) {
            response.send("Beklenmeyen bir hatayla karşılaşıldı...");
        }
        else {
            response.json(data);
        }
    });
});
module.exports = router;

Burada; eğer “name” kolunu “Gençay” olan veri varsa “surName” kolonunu “Yıldız (Yeni)” olarak güncelle, yok eğer yoksa “name” kolonu “Gençay” “surName” kolonuda “Yıldız (Yeni)” olan veriyi ekle demiş bulunmaktayız.

ID Bazlı Güncelleme(findByIdAndUpdate)
Id bazlı güncelleme işlemi için;

const express = require("express");
const router = express.Router();

const model = require("../models/employee");

router.get("/updateByIdEmployee", (request, response, next) => {
    model.findByIdAndUpdate("1", { surName: "Yıldız (Yeni)" }, (error, data) => {
        if (error) {
            response.send("Beklenmeyen bir hatayla karşılaşıldı...");
        }
        else {
            response.json(data);
        }
    });
});
module.exports = router;

şeklinde çalışılabilir.

Veri Silme

Üç farklı yöntemle veri silebiliriz. Bunlar;

  1. const express = require("express");
    const router = express.Router();
    
    const model = require("../models/employee");
    
    router.get("/deleteById", (request, response, next) => {
        model.findById("1", (error, data) => {
            if (error) {
                response.send("Beklenmeyen bir hatayla karşılaşıldı...");
            }
            else {
                data.remove(error => console.log("Veri silinirken beklenmeyen bir hatayla karşılaşıldı..."));
                response.json(data);
            }
        });
    });
    module.exports = router;
    

    Önce “findById” fonksiyonuyla ilgili veri getirilir, ardından veri üzerinden “remove” metodu ile veritabanından fiziksel olarak iligli veri silinir.

  2. const express = require("express");
    const router = express.Router();
    
    const model = require("../models/employee");
    
    router.get("/delete", (request, response, next) => {
        model.findOneAndRemove({ userName: "gncy2" }, (error, data) => {
            if (error) {
                response.send("Beklenmeyen bir hatayla karşılaşıldı...");
            }
            else {
                response.json(data);
            }
        });
    });
    
    module.exports = router;
    

    “findOneAndRemove” fonksiyonu ile şarta uyan ilk elemanı silecektir.

  3. const express = require("express");
    const router = express.Router();
    
    const model = require("../models/employee");
    
    router.get("/delete", (request, response, next) => {
        model.remove({ userName: "gncy2" }, (error, data) => {
            if (error) {
                response.send("Beklenmeyen bir hatayla karşılaşıldı...");
            }
            else {
                response.json(data);
            }
        });
    });
    
    module.exports = router;
    

    Şarta uyan tüm verileri silecektir.

Modeldeki Alt Propertylere Erişmek

Eğer ki elimizdeki model aşağıdaki gibi alt propertylerden oluşuyorsa;

const mongoose = require("mongoose");

module.exports = mongoose.model("Employees", new mongoose.Schem a({
    _id: Number,
    userName: String,
    name: String,
    surName: String,
    age: Number,
    country: {
        city: String,
        county: String,
        adress: {
            postcode: Number
        }
    }
}));

bu propertylere erişebilmek için aşağıdaki gibi çalışmak gerekmektedir.

const express = require("express");
const router = express.Router();

const model = require("../models/employee");

router.get("/updateExample", (request, response, next) => {
    model.update({ "country.city": "Ankara" }, { "country.adress.postcode": "06130" }, { upsert: true }, (error, data) => {
        if (error) {
            response.send("Beklenmeyen bir hatayla karşılaşıldı...");
        }
        else {
            response.json(data);
        }
    });
});

module.exports = router;

İlgililenlerin faydalanması dileğiyle…

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

Mobil sürümden çık