برنامه نویسی

بهترین روشها برای طراحی مدل های MongoDB مقیاس پذیر با Mongoose

ایجاد مدلهای پیچیده در MongoDB با استفاده از Mongoose برای اطمینان از مقیاس پذیری ، قابلیت حفظ و کارآیی نیاز به برنامه ریزی دقیق دارد. در اینجا بهترین روشها برای طراحی مدل های پیچیده در mongoDB با mongooseبشر


برای روابط یک به شخص از اسناد تعبیه شده استفاده کنید

اگر داده های مرتبط کوچک هستند و مرتباً با هم خوانده می شوند ، آن را تعبیه کرد در داخل سند.

مثال: کاربر با چندین آدرس

const mongoose = require("mongoose");

const AddressSchema = new mongoose.Schema({
  street: String,
  city: String,
  zip: String,
  country: String,
});

const UserSchema = new mongoose.Schema({
  name: String,
  email: { type: String, required: true, unique: true },
  addresses: [AddressSchema], // Embedded subdocument
});

const User = mongoose.model("User", UserSchema);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

جوانب مثبت: عملیات خواندن سریعتر ، کمتر نمایش داده شد

منفی ها: به روزرسانی ها نیاز به نوشتن دوباره کل سند دارند

از زمان: استفاده کنید:

  • داده ها است اغلب با هم بخوانید
  • تعداد اسناد تعبیه شده است کوچک (<10)

از منابع (عادی سازی) برای روابط یک به بسیاری استفاده کنید

اگر داده های مرتبط بزرگ یا به طور جداگانه به روز شده باشند ، منابع را ذخیره کنید (ObjectIDs).

مثال: کاربر با سفارشات متعدد (مجموعه داده بزرگ)

const OrderSchema = new mongoose.Schema({
  user: { type: mongoose.Schema.Types.ObjectId, ref: "User" }, // Reference to User
  totalPrice: Number,
  items: [{ product: String, quantity: Number }],
});

const Order = mongoose.model("Order", OrderSchema);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

جوانب مثبت: به روزرسانی های کارآمد ، از نفخ سند جلوگیری می کند

منفی ها: مستلزم populate() برای واکشی داده های مرتبط

از زمان: استفاده کنید:

  • مجموعه فرعی بزرگ می شود (> 10 مورد)
  • شما نیاز دارید عملیات CRUD مستقل در مجموعه فرعی

🔹 واکشی داده های ارجاع شده با جمعیت:

Order.find().populate("user").exec((err, orders) => {
  console.log(orders);
});
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


رویکرد ترکیبی (جاسازی جزئی + منابع)

برای با اندازه متوسط داده های مرتبط ، فقط زمینه های مورد استفاده را تعبیه می کنند و بقیه را مرجع می کنند.

مثال: خلاصه سفارش اما جزئیات سفارش مرجع

const OrderSchema = new mongoose.Schema({
  user: { type: mongoose.Schema.Types.ObjectId, ref: "User" },
  totalPrice: Number,
  items: [{ product: String, quantity: Number }],
  shipping: {
    address: String,
    status: { type: String, default: "Processing" }, // Frequently queried field
  },
});
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

بهترین های هر دو جهان – خواندن سریع و به روزرسانی های کارآمد


نمایه سازی برای پرس و جوهای سریع

شاخص ها سرعت پرس و جو را بهبود می بخشند. همیشه زمینه هایی را که غالباً پرس و جو می شوند ، فهرست کنید.

const UserSchema = new mongoose.Schema({
  email: { type: String, required: true, unique: true, index: true }, // Index for fast lookup
  createdAt: { type: Date, default: Date.now, index: -1 }, // Sort index for fast filtering
});
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

از فهرست ها در:

  • مزارع غالباً پرسیده می شوند (emailبا username)
  • زمینه های مورد استفاده در مرتب سازی (createdAt)
  • زمینه های مورد استفاده در فیلتر (statusبا category)

🔹 استفاده از فهرست را بررسی کنید

db.users.getIndexes();
db.orders.find({ userId: "123" }).explain("executionStats");
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


Timestamps برای ردیابی

استفاده کردن timestamps: true در طرح خود برای ذخیره خودکار createdAt وت updatedAtبشر

const OrderSchema = new mongoose.Schema({
  totalPrice: Number,
}, { timestamps: true });
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


استفاده کردن lean() برای پرس و جوهای خواندنی

lean() عملکرد را بهبود می بخشد بازگشت اشیاء JavaScript ساده به جای اسناد کامل mongoose.

Order.find().lean().exec();
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

30-50 ٪ سریعتر از نمایش داده های عادی

از زمان: استفاده کنید:

  • شما نیازی به اصلاح نیست داده های بازیابی شده
  • شما فقط به خروجی JSON خام نیاز دارید برای پاسخ های API

صفحه بندی برای مجموعه داده های بزرگ

استفاده کردن صفحه بندی برای محدود کردن نتایج پرس و جو برای عملکرد بهتر.

const page = 1;
const limit = 10;

Order.find()
  .skip((page - 1) * limit)
  .limit(limit)
  .exec();
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

اجتناب کردن limit(1000)، زیرا می تواند باعث ایجاد مشکلات عملکرد شود


خط لوله تجمع برای نمایش داده شدگان پیچیده

استفاده کردن تجمع برای گزارش و نمایش داده های پیچیده.

Order.aggregate([
  { $match: { status: "Completed" } },
  { $group: { _id: "$user", totalSpent: { $sum: "$totalPrice" } } },
]);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


به جای حذف یک سند ، استفاده از a deletedAt مزرعهبشر

const UserSchema = new mongoose.Schema({
  name: String,
  email: String,
  deletedAt: { type: Date, default: null },
});
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

موارد حذف شده را بدون از دست دادن داده ها پنهان می کند

🔹 پرس و جو فقط کاربران فعال:

User.find({ deletedAt: null });
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


زمینه های مجازی انجام می دهند نه در پایگاه داده ذخیره شوید اما به صورت پویا محاسبه می شوند.

UserSchema.virtual("fullName").get(function () {
  return `${this.firstName} ${this.lastName}`;
});
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

برای داده های مشتق شده بدون افزایش اندازه DB استفاده کنید


🚀 خلاصه بهترین روشها
✅ داده های کوچک را جاسازی کنید ، داده های بزرگ را مرجع کنید

✅ استفاده کنید lean()، صفحه بندی و حافظه پنهان

index که اغلب زمینه ها را پرسیده می شود

✅ به جای حذف واقعی از حذف های نرم استفاده کنید

✅ از متغیرهای محیط برای امنیت استفاده کنید

✅ برای اتوماسیون از وسط نرم افزار استفاده کنید

پیروی از این شیوه ها به شما در ساخت برنامه های کاربردی کارآمد ، مقیاس پذیر و قابل حفظ MongoDB با Mongoose کمک می کند! 🚀

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا