从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' } ... }