logo
eng-flag

Mongoose Notları ve İpuçları

İçindekiler

  1. Kurulum
  2. MongoDB'ye Bağlanma
  3. Şemaların Tanımlanması
  4. Modellerin Oluşturulması
  5. CRUD İşlemleri
  6. Sorgulama
  7. Populate
  8. Middleware
  9. Doğrulama
  10. İndeksleme
  11. Sanal Alanlar
  12. Eklentiler
  13. İşlemler
  14. Hata Yönetimi
  15. En İyi Uygulamalar

Kurulum

Projenize Mongoose'u yükleyin:

npm install mongoose

MongoDB'ye Bağlanma

Projenize Mongoose'u yükleyin:

const mongoose = require("mongoose");

// Yerel MongoDB'ye bağlanma
mongoose.connect("mongodb://localhost/mydatabase", {
  useNewUrlParser: true,
  useUnifiedTopology: true,
});

// MongoDB Atlas'a bağlanma
mongoose.connect(
  "mongodb+srv://<kullanici_adi>:<sifre>@cluster0.mongodb.net/mydatabase",
  {
    useNewUrlParser: true,
    useUnifiedTopology: true,
  }
);

// Bağlantı olaylarını yönetme
const db = mongoose.connection;
db.on("error", console.error.bind(console, "bağlantı hatası:"));
db.once("open", function () {
  console.log("MongoDB'ye bağlanıldı");
});

Şemaların Tanımlanması

Şemalar, bir koleksiyondaki belgelerin yapısını tanımlar.

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

// Temel şema
const userSchema = new Schema({
  name: String,
  email: String,
  age: Number,
});

// Daha fazla seçenek içeren şema
const productSchema = new Schema({
  name: {
    type: String,
    required: true,
    trim: true,
  },
  price: {
    type: Number,
    min: 0,
  },
  category: {
    type: String,
    enum: ["Elektronik", "Kitaplar", "Giyim"],
  },
  inStock: {
    type: Boolean,
    default: true,
  },
  createdAt: {
    type: Date,
    default: Date.now,
  },
});

Modellerin Oluşturulması

Modeller, Şema tanımlarından türetilmiş yapılandırıcılardır.

const User = mongoose.model("User", userSchema);
const Product = mongoose.model("Product", productSchema);

CRUD İşlemleri

Oluşturma

// Tek bir belge oluşturma
const newUser = new User({
  name: "John Doe",
  email: "john@example.com",
  age: 30,
});

newUser.save((err, user) => {
  if (err) return console.error(err);
  console.log("Kullanıcı kaydedildi:", user);
});

// Birden fazla belge oluşturma
User.create(
  [
    { name: "Jane Doe", email: "jane@example.com", age: 25 },
    { name: "Bob Smith", email: "bob@example.com", age: 35 },
  ],
  (err, users) => {
    if (err) return console.error(err);
    console.log("Kullanıcılar oluşturuldu:", users);
  }
);

Okuma

// Tüm belgeleri bulma
User.find({}, (err, users) => {
  if (err) return console.error(err);
  console.log("Tüm kullanıcılar:", users);
});

// Belirli kriterlere göre belgeleri bulma
User.find({ age: { $gte: 18 } }, (err, users) => {
  if (err) return console.error(err);
  console.log("Yetişkin kullanıcılar:", users);
});

// Tek bir belge bulma
User.findOne({ email: "john@example.com" }, (err, user) => {
  if (err) return console.error(err);
  console.log("Bulunan kullanıcı:", user);
});

// ID ile bulma
User.findById("5f7c3b3f9d3e2a1234567890", (err, user) => {
  if (err) return console.error(err);
  console.log("ID ile kullanıcı:", user);
});

Güncelleme

// Tek bir belgeyi güncelleme
User.updateOne({ name: "John Doe" }, { age: 31 }, (err, result) => {
  if (err) return console.error(err);
  console.log("Güncelleme sonucu:", result);
});

// Birden fazla belgeyi güncelleme
User.updateMany({ age: { $lt: 18 } }, { isMinor: true }, (err, result) => {
  if (err) return console.error(err);
  console.log("Güncelleme sonucu:", result);
});

// Bul ve güncelle
User.findOneAndUpdate(
  { email: "john@example.com" },
  { $inc: { age: 1 } },
  { new: true },
  (err, updatedUser) => {
    if (err) return console.error(err);
    console.log("Güncellenmiş kullanıcı:", updatedUser);
  }
);

Silme

// Tek bir belgeyi silme
User.deleteOne({ name: "John Doe" }, (err) => {
  if (err) return console.error(err);
  console.log("Kullanıcı silindi");
});

// Birden fazla belgeyi silme
User.deleteMany({ age: { $lt: 18 } }, (err) => {
  if (err) return console.error(err);
  console.log("Küçük yaşlı kullanıcılar silindi");
});

// Bul ve sil
User.findOneAndDelete({ email: "john@example.com" }, (err, deletedUser) => {
  if (err) return console.error(err);
  console.log("Silinen kullanıcı:", deletedUser);
});

Sorgulama

Mongoose, zengin bir sorgu API'si sağlar.

// Temel sorgulama
User.find({ age: { $gte: 18 } })
  .sort({ name: 1 })
  .limit(10)
  .select("name email")
  .exec((err, users) => {
    if (err) return console.error(err);
    console.log("Yetişkin kullanıcılar:", users);
  });

// Sorguları zincirleme
User.find({ isActive: true })
  .where("age")
  .gte(18)
  .lte(65)
  .where("email")
  .ne(null)
  .limit(50)
  .sort("-lastLogin")
  .select("name email")
  .exec((err, users) => {
    if (err) return console.error(err);
    console.log("Aktif yetişkin kullanıcılar:", users);
  });

// Sorgu oluşturucularını kullanma
const query = User.find({ isActive: true });
query.where("age").gte(18).lte(65);
query.where("email").ne(null);
query.limit(50).sort("-lastLogin").select("name email");
query.exec((err, users) => {
  if (err) return console.error(err);
  console.log("Aktif yetişkin kullanıcılar:", users);
});

// $or operatörünü kullanma
User.find(
  {
    $or: [{ age: { $lt: 18 } }, { age: { $gt: 65 } }],
  },
  (err, users) => {
    if (err) return console.error(err);
    console.log("Çalışma yaşında olmayan kullanıcılar:", users);
  }
);

// Regex kullanma
User.find({ name: /^John/ }, (err, users) => {
  if (err) return console.error(err);
  console.log("John ile başlayan isimlere sahip kullanıcılar:", users);
});

Populate

Populate, belgelerdeki belirli yolları diğer koleksiyonlardan belgelerle otomatik olarak değiştirme sürecidir.

// Referanslarla şemaları tanımlama
const authorSchema = new Schema({
  name: String,
  bio: String,
});

const bookSchema = new Schema({
  title: String,
  author: { type: Schema.Types.ObjectId, ref: "Author" },
});

const Author = mongoose.model("Author", authorSchema);
const Book = mongoose.model("Book", bookSchema);

// Bir yazar ve bir kitap oluşturma
const author = new Author({ name: "John Doe", bio: "Verimli bir yazar" });
author.save((err, savedAuthor) => {
  if (err) return console.error(err);
  const book = new Book({ title: "Mongoose Guide", author: savedAuthor._id });
  book.save((err, savedBook) => {
    if (err) return console.error(err);
    console.log("Kitap kaydedildi:", savedBook);
  });
});

// Populate kullanma
Book.findOne({ title: "Mongoose Guide" })
  .populate("author")
  .exec((err, book) => {
    if (err) return console.error(err);
    console.log("Kitap ve yazar bilgisi:", book);
  });

Middleware

Middleware'ler, belgeler üzerinde belirli işlemleri gerçekleştiren işlevlerdir.

// Middleware tanımlama
userSchema.pre("save", function (next) {
  if (!this.email) {
    return next(new Error("Email gereklidir"));
  }
  next();
});

// Middleware işleyicisi tanımlama
userSchema.post("save", function (doc) {
  console.log("Kullanıcı kaydedildi:", doc);
});

Doğrulama

Mongoose, şemalar üzerinde doğrulama işlevselliği sağlar.

const userSchema = new Schema({
  name: {
    type: String,
    required: [true, "Kullanıcı adı gereklidir"],
    minlength: [3, "Kullanıcı adı en az 3 karakter olmalıdır"],
  },
  email: {
    type: String,
    required: [true, "Email gereklidir"],
    match: [/.+@.+..+/, "Geçerli bir email adresi giriniz"],
  },
  age: {
    type: Number,
    min: [0, "Yaş negatif olamaz"],
    max: [120, "Yaş çok büyük"],
  },
});

İndeksleme

İndeksler, sorgu performansını artırmak için kullanılır.

// Şema üzerinde indeks oluşturma
userSchema.index({ email: 1 });
userSchema.index({ age: -1 });

// Koleksiyon üzerinde indeks oluşturma
User.createIndex({ email: 1 });

Sanal Alanlar

Sanal alanlar, şemada fiziksel olarak depolanmayan hesaplanmış verileri temsil eder.

userSchema.virtual("fullName").get(function () {
  return `${this.firstName} ${this.lastName}`;
});

Eklentiler

Mongoose, çeşitli eklentiler sağlar.

// Eklenti yükleme
const mongoosePaginate = require("mongoose-paginate-v2");
userSchema.plugin(mongoosePaginate);

İşlemler

İşlemler, Mongoose'un çeşitli operasyonları için sağladığı yardımcı işlevlerdir.

// İşlem oluşturma
const session = await mongoose.startSession();
session.startTransaction();
try {
  await User.create([{ name: "John" }], { session });
  await Product.create([{ title: "Book" }], { session });
  await session.commitTransaction();
} catch (error) {
  await session.abortTransaction();
  throw error;
} finally {
  session.endSession();
}

Hata Yönetimi

Hata yönetimi, hataları etkili bir şekilde ele almak için çeşitli stratejileri içerir.

User.findById("invalid_id", (err, user) => {
  if (err) {
    console.error("Hata:", err);
    return;
  }
  console.log("Kullanıcı:", user);
});

En İyi Uygulamalar

  1. Şemaları Küçük ve Modüler Tutun: Şemaları belirli bir sorumlulukla sınırlı tutarak modüler hale getirin.
  2. İndeksleri Akıllıca Kullanın: Sık kullanılan sorgular için indeks oluşturun.
  3. Doğrulamaları Kullanın: Şema doğrulamalarını etkin bir şekilde kullanarak veri bütünlüğünü koruyun.
  4. Middleware'leri Verimli Kullanın: İşlemleri otomatikleştirmek için middleware'leri etkili bir şekilde kullanın.
  5. Hataları İyi Yönetin: Hataları düzgün bir şekilde işleyin ve kullanıcıya anlamlı geri bildirimler sağlayın.

2024 © Tüm hakları saklıdır - buraxta.com