猫鼬-1个模式的多个模型

时间:2018-09-26 16:12:33

标签: node.js mongodb mongoose mongoose-schema

我正在使用猫鼬v5.2.17。 我想知道是否可以将多个模型映射到1模式。 例如-我有以下模型

const mongoose = require('mongoose');
const validator = require('validator');
const jwt = require('jsonwebtoken');
const _ = require('lodash');
const bcrypt = require('bcryptjs');

const UserSchema = new mongoose.Schema({
  email: {
    type: String,
    required: true,
    trim: true,
    minlength: 1,
    unique: true,
    validate: {
      validator: validator.isEmail,
      message: '{VALUE} is not a valid email',
    },
  },
  password: {
    type: String,
    required: true,
    minlength: 6,
  },  
  isTrialUser: {
    type: Boolean,
    default: true,
  },
  isAdminUser: {
    type: Boolean,
    default: false,
  }
});

UserSchema.methods.toJSON = function () {
  const user = this;
  const userObject = user.toObject();

  return _.pick(userObject, ['_id', 'email', 'isTrialUser']);
};


UserSchema.pre('save', function (next) {
  const user = this;

  if (user.isModified('password')) {
    bcrypt.genSalt(10, (err, salt) => {
      bcrypt.hash(user.password, salt, (hashErr, hash) => {
        user.password = hash;
        next();
      });
    });
  } else {
    next();
  }
});

const User = mongoose.model('User', UserSchema);

module.exports = { User, UserSchema };

我是否可以创建另一个AdminModel,可以在其中使用特定于管理员的方法? 我还想从AdminModel的toJSON方法返回所有数据。

请告诉我这是否可行,或者是否有更好的方法来执行此类任务

谢谢 达米安

1 个答案:

答案 0 :(得分:2)

如果我对您的理解正确,那么您想在AdminModel中继承UserModel,并使用其他方法继承decorate,例如,可以使用util.inherits(或所谓的Mongoose鉴别符),例如所以:

function BaseSchema() {
  Schema.apply(this, arguments);

  this.add({
    name: String,
    createdAt: Date
  });
}
util.inherits(BaseSchema, Schema);

var UserSchema = new BaseSchema();
var AdminSchema = new BaseSchema({ department: String });

您可以在Mongoose docs中了解更多信息。

mongoose discriminators here

上也有一篇不错的文章