基于 属性 的动态猫鼬模式

Dynamic Mongoose Schema based on property

我有以下用户架构(其中整合了不同用户类型的所有不同属性):

var UserSchema = new mongoose.Schema({
  status: String,
  firstName: String,
  lastName: String,
  address: Object,
  email: {type: String, lowercase: true, unique: true, required: [true, "can't be blank"], match: [/\S+@\S+\.\S+/, 'is invalid'], index: true},
  organization: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Organization' }],
  phone: {type: Number, unique: true, required: true, required: [true, "can't be blank"]}, 
  role: String, 
  hash: String,
  salt: String,
  deliverySchedule:  [{type: String, required: true}]

}

"Common" 架构(所有用户类型的共同点):

var UserSchema = new mongoose.Schema({
  status: String,
  firstName: String,
  lastName: String,
  email: {type: String, lowercase: true, unique: true, required: [true, "can't be blank"], match: [/\S+@\S+\.\S+/, 'is invalid'], index: true},
  phone: {type: Number, unique: true, required: true, required: [true, "can't be blank"]}, 
  role: String, 
  hash: String,
  salt: String
}

角色 = "Customer":

  address: [{type: Object, required: true}]

角色 = "DeliveryMan":

      deliverySchedule:  [{type: String, required: true}]
      organization: [{ type: mongoose.Schema.Types.ObjectId, required: true, 
ref: 'Organization' }],

角色 = "Seller":

      organization: [{ type: mongoose.Schema.Types.ObjectId, required: true, 
ref: 'Organization' }],

我想根据用户的角色向 "common" 模式添加(如果可能的话需要)一些字段。但是,我想将它们存储在同一个集合中。

如何向我的 models/Users.js 添加方法以将属性添加到基于 "user.role"

的模式

使每个角色相关字段的 require validation 可选。

var UserSchema = new mongoose.Schema({
  status: String,
  firstName: String,
  lastName: String,
  email: {type: String, lowercase: true, unique: true, required: [true, "can't be blank"], match: [/\S+@\S+\.\S+/, 'is invalid'], index: true},
  phone: {type: Number, unique: true, required: true, required: [true, "can't be blank"]}, 
  role: {type: String, enum: ['Customer', 'DeliveryMan', 'Seller'], required: true},
  address: {type: [Object],  required: isRequired("address")},
  deliverySchedule: {type: [String], required: isRequired("deliverySchedule")},
  organization: { type: [mongoose.Schema.Types.ObjectId], ref: 'Organization', required: isRequired("organization")},
  hash: String,
  salt: String
});

function isRequired(field){
    return function(){
        if(field == "address"){
            return this.role === "Customer"
        }
        else if(field == "deliverySchedule"){
            return this.role === "DeliveryMan"
        }
        else if(field == "organization"){
            return this.role === "Seller" || this.role === "DeliveryMan"
        }
    }
};