Wednesday, 7 June 2017

Dynamic Mongoose Schema based on property

I have the following user schema (where all distinct properties of different user types are consolidated):

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" Schema (what all user types share in 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
}

Role = "Customer":

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

Role = "DeliveryMan":

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

Role = "Seller":

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

I would like to add (and REQUIRE if possible) some fields to the "common" schema based on the user's role. However, I want to store them in the same collection.

How can I add a method to my models/Users.js to add properties to the schema based on "user.role"



via Moshe

No comments:

Post a Comment