从Mongoose Model获取模式属性

use*_*015 54 mongoose mongodb

我正在使用Mongoose.js来创建带有模式的模型.

我有一个模型列表(很多),有时我想获得构成特定模型的属性/键.

是否有方法为任何给定的模型提取属性模式?

例如,

var mySchema = module.exports = new Schema({
  SID: {
    type: Schema.Types.ObjectId
    //, required: true
  },
  teams: {
    type: [String]
  },
  hats: [{
    val: String,
    dt: Date
  }],
  shields: [{
    val: String,
    dt: Date
  }],
  shoes: [{
    val: String,
    dt: Date
  }]
}
Run Code Online (Sandbox Code Playgroud)

);

是否可以提取/识别模式的属性[SID, hats, teams, shields, shoes]

gus*_*nke 70

对的,这是可能的.

每个模式都有一个paths属性,看起来有点像这样(这是我的代码的一个例子):

paths: {
    number: [Object],
    'name.first': [Object],
    'name.last': [Object],
    ssn: [Object],
    birthday: [Object],
    'job.company': [Object],
    'job.position': [Object],
    'address.city': [Object],
    'address.state': [Object],
    'address.country': [Object],
    'address.street': [Object],
    'address.number': [Object],
    'address.zip': [Object],
    email: [Object],
    phones: [Object],
    tags: [Object],
    createdBy: [Object],
    createdAt: [Object],
    updatedBy: [Object],
    updatedAt: [Object],
    meta: [Object],
    _id: [Object],
    __v: [Object]
}
Run Code Online (Sandbox Code Playgroud)

您也可以通过模型访问它.它在Model.schema.paths.

  • 确定......只是我将来可以参考的东西,而不是在这里提问. (4认同)

js_*_*alf 40

没有足够的rep来评论,但这也会吐出一个列表并循环遍历所有模式类型.

mySchema.schema.eachPath(function(path) {
    console.log(path);
});
Run Code Online (Sandbox Code Playgroud)

应该打印出来:

number
name.first
name.last
ssn
birthday
job.company
job.position
address.city
address.state
address.country
address.street
address.number
address.zip
email
phones
tags
createdBy
createdAt
updatedBy
updatedAt
meta
_id
__v
Run Code Online (Sandbox Code Playgroud)

或者您可以将所有属性作为数组获取,如下所示:

var props = Object.keys(mySchema.schema.paths);
Run Code Online (Sandbox Code Playgroud)

  • 这不好,因为它会给你对象的所有属性,包括方法! (2认同)

sty*_*dev 9

lodash的解决方案,选择所有架构属性的函数,不包括指定的

_.mixin({ pickSchema: function (model, excluded) {
    var fields = [];
    model.schema.eachPath(function (path) {
       _.isArray(excluded) ? excluded.indexOf(path) < 0 ? fields.push(path) : false : path === excluded ? false : fields.push(path);
    });
    return fields;
   }
});

_.pickSchema(User, '_id'); // will return all fields except _id

_.pick(req.body, _.pickSchema(User, ['_id', 'createdAt', 'hidden'])) // all except specified properties
Run Code Online (Sandbox Code Playgroud)

在这里阅读更多内容https://gist.github.com/styopdev/95f3fed98ce3ebaedf5c


小智 9

我的解决方案使用猫鼬模型。

架构属性

const schema = {
  email: {
    type: String,
    required: 'email is required',
  },
  password: {
    type: String,
    required: 'password is required',
  },
};
Run Code Online (Sandbox Code Playgroud)

架构

const FooSchema = new Schema(schema);
Run Code Online (Sandbox Code Playgroud)

模型

const FooModel = model('Foo', FooSchema);
Run Code Online (Sandbox Code Playgroud)

从模型中获取属性:

Object.keys(FooModel.schema.tree)
Run Code Online (Sandbox Code Playgroud)

结果:

[
  'email',
  'password',
  '_id',
  '__v'
] 
Run Code Online (Sandbox Code Playgroud)