کد MongoDB Node.js خود را بهینه کنید: جستجوی $ را با Mongoose Ref جایگزین کنید – [Anni]
![کد MongoDB Node.js خود را بهینه کنید: جستجوی $ را با Mongoose Ref جایگزین کنید – [Anni] کد MongoDB Node.js خود را بهینه کنید: جستجوی $ را با Mongoose Ref جایگزین کنید – [Anni]](https://i3.wp.com/media2.dev.to/dynamic/image/width=1000,height=500,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0h1hzzxq2g3crmsx3fg3.png?w=780&resize=780,470&ssl=1)
مقدمه:
در MongoDB ، به خصوص هنگام کار با mongoose در node.js، دو روش اصلی برای واکشی داده های مرتبط وجود دارد:
- با استفاده از بومی MongoDB
$lookup
در خطوط لوله جمع آوری - با استفاده از داخلی Mongoose
ref
وتpopulate()
عمل
در حالی که $lookup
کنترل ریز دانه ای می دهد و به طور مستقیم در سطح پایگاه داده کار می کند ، جمعیت مبتنی بر Mongoose کد شما را ساده می کند ، مدل های داده شما را قابل حفظ تر می کند و منجر به تجربه بهتر توسعه دهنده برای بیشتر موارد استفاده می شود.
بیایید این را با استفاده از یک دنیای واقعی کشف کنیم مدیریت پروژه مثال شامل اسپرینت وت وظایفبشر
طراحی طرحواره: کارها و اسپرینت ها
در اینجا نحوه مدل سازی رابطه بین وظایف وت اسپرینت در mongoose با استفاده از ref
وت populate
بشر
const taskSchema = new mongoose.Schema({
sprintId: {
type: mongoose.Types.ObjectId,
ref: 'sprints'
},
projectId: {
type: mongoose.Types.ObjectId,
ref: 'projects',
required: true
},
title: { type: String, required: true, minlength: 3 },
description: { type: String, default: '' },
type: {
type: String,
enum: ['Story', 'Bug', 'Task', 'Epic', 'Sub-task'],
default: 'Task'
},
status: {
type: String,
enum: ['To Do', 'In Progress', 'In Review', 'Done', 'Blocked'],
default: 'To Do'
},
priority: {
type: String,
enum: ['Low', 'Medium', 'High', 'Critical'],
default: 'Medium'
},
assignee: {
_id: mongoose.Types.ObjectId,
email: String,
displayName: String
},
reporter: {
_id: mongoose.Types.ObjectId,
email: String,
displayName: String
},
estimate: { type: Number, default: 0 },
createdBy: {
_id: mongoose.Types.ObjectId,
email: String,
displayName: String
},
createdAt: { type: Date, default: Date.now },
dueDate: Date,
lastModified: Date
});
منطق ایجاد کار
هنگام ایجاد یک کار ، ما همچنین شناسه آن را به سمت اسپرینت مربوطه سوق می دهیم:
const taskModel = {
createTask: async (sprintId, projectId, title, description, type, status, priority, assignee, reporter, estimate, createdBy, createdAt, dueDate, lastModified) => {
const task = new Task({
sprintId: sprintId ? new mongoose.Types.ObjectId(sprintId) : undefined,
projectId: new mongoose.Types.ObjectId(projectId),
title,
description,
type,
status,
priority,
assignee,
reporter,
estimate,
createdBy,
createdAt,
dueDate,
lastModified
});
const savedTask = await task.save();
if (sprintId) {
const Sprint = mongoose.model('sprints');
await Sprint.findByIdAndUpdate(
sprintId,
{ $push: { tasks: task._id } },
{ new: true }
);
}
return savedTask;
}
};
طرحواره اسپرینت با tasks
به عنوان آرایه ref
const sprintSchema = new mongoose.Schema({
projectId: {
type: mongoose.Types.ObjectId,
ref: 'projects',
required: true
},
sprintNum: { type: String, required: true },
name: { type: String, required: true },
description: { type: String, default: '' },
duration: { type: String, enum: ['1 Week', '2 Weeks', '3 Weeks'] },
startDate: { type: Date, required: true },
endDate: { type: Date, required: true },
tasks: [{
type: mongoose.Types.ObjectId,
ref: 'tasks'
}],
createdBy: {
_id: mongoose.Types.ObjectId,
email: String,
displayName: String
}
}, { timestamps: true });
وظایف جمع شده از اسپرینت
به جای نوشتن یک مجموعه $lookup
پرس و جو ، ما به سادگی انجام می دهیم:
const getAllSprints = async () => {
return await Sprint.find({}).populate('tasks').exec();
};
این به طور خودکار تمام اسناد کار مرتبط را برای هر اسپرینت جلب می کند!
برخی از عوامل به علاوه برای استفاده از Ref Over Lookup
- کد در مقایسه با جستجوی بسیار خواندنی است.
- ادغام Mongoose یکپارچه است. تنها کاری که شما فقط شناسه ها را به آرایه فشار می دهید و Ref و Probal کار را به طور خودکار انجام می دهد.
- توجه: این برای پیوندهای کوچک یک سطح آسان تر خواهد بود. اگر پیوست چند سطحی یا پیوست های پیچیده دارید ، جمع آوری بهترین ها برای انجام این کار است.
پایان
اگر از Mongoose استفاده می کنید ، از جستجوی $ استفاده نکنید ، مگر اینکه یک مورد استفاده واقعاً پیچیده داشته باشید. برای بیشتر برنامه ها ، به ویژه سیستم های مبتنی بر CRUD مانند مدیران وظیفه ، Ref و Probal () بیش از حد کافی هستند.
نه تنها نحو پاک کننده است ، بلکه کد شما را نیز بیانگر و محور محور نگه می دارد. بگذارید MongoDB روابط را در پشت صحنه انجام دهد – دقیقاً مانند یک ORM خوب.