برنامه نویسی

کد MongoDB Node.js خود را بهینه کنید: جستجوی $ را با Mongoose Ref جایگزین کنید – [Anni]

مقدمه:

در MongoDB ، به خصوص هنگام کار با mongoose در node.js، دو روش اصلی برای واکشی داده های مرتبط وجود دارد:

  1. با استفاده از بومی MongoDB $lookup در خطوط لوله جمع آوری
  2. با استفاده از داخلی 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

  1. کد در مقایسه با جستجوی بسیار خواندنی است.
  2. ادغام Mongoose یکپارچه است. تنها کاری که شما فقط شناسه ها را به آرایه فشار می دهید و Ref و Probal کار را به طور خودکار انجام می دهد.
  3. توجه: این برای پیوندهای کوچک یک سطح آسان تر خواهد بود. اگر پیوست چند سطحی یا پیوست های پیچیده دارید ، جمع آوری بهترین ها برای انجام این کار است.

پایان

اگر از Mongoose استفاده می کنید ، از جستجوی $ استفاده نکنید ، مگر اینکه یک مورد استفاده واقعاً پیچیده داشته باشید. برای بیشتر برنامه ها ، به ویژه سیستم های مبتنی بر CRUD مانند مدیران وظیفه ، Ref و Probal () بیش از حد کافی هستند.

نه تنها نحو پاک کننده است ، بلکه کد شما را نیز بیانگر و محور محور نگه می دارد. بگذارید MongoDB روابط را در پشت صحنه انجام دهد – دقیقاً مانند یک ORM خوب.

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

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

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

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