Kaka Notes

Description about Blog Author


Xử lý một trường ref trong Mongoose cho nhiều Model khác nhau

bài toán đưa ra như sau

  • Ta muốn tách model user thành các model {‘User’, ‘Manager’, ‘Admin’, …} để tăng thêm mức độ bảo mật.
  • Từ vấn đề này phát sinh ra việc tạo 1 tài khoản user không biết ref như thế nào trong ví dụ dưới đây:
const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
  createdBy: {
    type: mongoose.Schema.Types.ObjectId,
    required: true,
    // Thêm trường này để xác định loại người tạo
    ref: 'User', // Có thể là User, có thể là Admin hoặc Manager
  },
  // Các trường khác...
});

// Ví dụ về cách tạo một instance
const User = mongoose.model('User', userSchema);

[*] Hạn chế: Mongoose không hỗ trợ trực tiếp việc tham chiếu đến nhiều mô hình khác nhau trong cùng một trường. —> Hướng giải quyết: ta bổ sung thêm trường type(cụ thể createdByType) với required: true cho model. Để khi tạo User thì tương ứng với mỗi type ta ref để đúng collection chứa Document cần ref

Minh họa lại như sau:

const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
  createdBy: {
    type: mongoose.Schema.Types.ObjectId,
    required: true,
    // Sử dụng refPath để tham chiếu đến Model tương ứng
    refPath: 'createdByType',
  },
  createdByType: {
    type: String,
    enum: ['Admin', 'Manager', 'User'], // Các loại cho phép
    required: true,
  },
  // Các trường khác...
});

// Ví dụ về cách tạo một instance
const User = mongoose.model('User', userSchema);

// Lưu instance
const newUser = new User({
  createdBy: someAdminOrManagerOrUserId,
  createdByType: 'Admin', // Hoặc 'Manager', 'User' tương ứng
  // Các trường khác...
});
newUser.save();