【问题标题】:How to get a list of available Mongoose Discriminators?如何获取可用的 Mongoose 鉴别器列表?
【发布时间】:2018-07-11 20:28:07
【问题描述】:

假设您有一个用户方案,可用于创建名为 User 的基本模型。然后对于用户角色,您使用 mongoose 鉴别器来创建称为 Admin、Employee 和 Client 的继承模型。有没有办法以编程方式确定 User 模型有多少区分/继承/角色可用,以及可用的名称?

我的代码方面的问题:

文件:models/user.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var options = {discriminatorKey: 'role'};

var userSchema = mongoose.Schema({
  name: String,
  email: String,
  password: String,
},options);

var User = mongoose.model('User', userSchema);

var Client = User.discriminator("Client", mongoose.Schema({
  Address : String,
  Tax_identification : String,
  Phone_number : String,
  Internal_Remarks : String,
  CRM_status : String,
  Recent_contact : String,
}));
var Employee = User.discriminator("Employee",mongoose.Schema({
  Staff_Id: String,
}));

module.exports = {User: User, Client: Client, Employee: Employee };

文件:controllers/usersController.js

var User = require('../models/user.js').User;


module.exports = {
  registerRoutes: function(app){
     app.get('user/create',this.userCreateCallback)
  },

  userCreateCallback: function(req,res){

    //Get Available User Roles - The function below doesn't exist, 
    //Just what I hypothetically want to achieve:

    User.geAvailableDiscriminators(function(err,roles){

      res.render('user/create',{roles:roles})      

    });

  }
};

我希望我能够表达我想要做的事情。也欢迎替代方法。

【问题讨论】:

    标签: node.js express mongoose mongoose-schema discriminator


    【解决方案1】:

    由于v4.11.13,猫鼬模型有model.discriminators,这是一个模型数组,以鉴别器模型的名称为键。

    如果你这样做console.log(User.discriminators),你会得到:

    {
      Client: {
        ....
      },
      Employee: {
      }
    }
    

    据我所知,这是not documented anywhere

    lib.helpers.model.discriminators.js 中的第 158 行是它的创建位置。

    【讨论】:

    【解决方案2】:

    我认为您想获取所有鉴别器的名称和值,因为您可以简单地使用这些名称

    User.discriminators
    

    但要查找值,您可以使用它

    return Promise.all(Object.keys(discriminators).map(i => 
        discriminators[i].find({ userId: this._id }))
    ).then(promiseResults =>
        promiseResults.reduce((arr, el) => arr.concat(el), [])
    );
    

    为此,您需要将 userId 放在每个鉴别器下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      • 1970-01-01
      • 2017-08-16
      • 2015-02-03
      • 1970-01-01
      相关资源
      最近更新 更多