بهترین روشها برای طراحی مدل های 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 کمک می کند! 🚀