从Mongoose模型获取模式属性

我正在使用Mongoose.js创build具有模式的模型。

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

有没有一种方法来拉出任何给定模型的属性模式?

例如,

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 }] } 

);

是否有可能拉出/识别模式的属性[SID, hats, teams, shields, shoes]

对的,这是可能的。

每个模式都有一个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] } 

你也可以通过模型来访问它。 它在Model.schema.paths下。

没有足够的代表评论,但这也吐出一个列表,并遍历所有的架构types。

 mySchema.schema.eachPath(function(path) { console.log(path); }); 

应该打印出来:

 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 

或者你可以像这样获得所有的属性:

 var props = Object.keys(mySchema.schema.paths); 

lodash的解决scheme,function是挑选所有模式属性,不包括指定的

 _.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 

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

如果你只想添加你添加的属性,而不是ORM以'$ ___'开始的添加方法,你必须把文档转换成对象,然后像这样访问属性:

 Object.keys(document.toObject()); 

如果你想拥有所有的属性值(包括嵌套和填充属性),只需使用toObject()方法:

 let modelAttributes = null; SomeModel.findById('someId').populate('child.name').exec().then((result) => { modelAttributes = result.toObject(); console.log(modelAttributes); }); 

输出将是:

 { id: 'someId', name: 'someName', child: { name: 'someChildName' } ... }