我在mongoose中有一个UserSchema
模式:
var UserSchema = new Schema({
name: String,
username: String,
email: String,
role: {type: String, default: 'user'},
following: [{type: Schema.ObjectId, ref: 'User'}],
followers: [{type: Schema.ObjectId, ref: 'User'}],
hashedPassword: String,
provider: String,
salt: String,
facebook: {},
twitter: {},
github: {},
google: {}
});
我创建了一个虚拟的profile
,它只返回公共配置文件的信息:
UserSchema
.virtual('profile')
.get(function() {
return {
'username': this.username,
'name': this.name,
'role': this.role
};
});
我的问题是如何在发出find
请求时只获得这些信息。
UserSchema.statics = {
list: function (options, callback) {
var criteria = options.criteria || {};
this.find(criteria)
.select(/* What to put here? */)
.limit(options.perPage)
.skip(options.perPage * options.page)
.exec(callback);
}
};
当然,我可以简单地写上username
,name
和role
,但是那样的话,代码会重复,我能避免吗?
3条答案
按热度按时间jslywgbw1#
根据蒙古杰的文件
只有非虚拟属性才能用作查询的一部分和用于字段选择。
你可以这样做
但不是这个
您可以在此处阅读更多信息http://mongoosejs.com/docs/guide.html#virtuals
daolsyd02#
在填充Try it中:
jtw3ybtb3#
除了这个
find
之外,您是否还在使用虚拟profile
?您的虚拟实际上只是指定了一些字段,没有什么更动态的,因此,如果您只是尝试在查询中选择字段,我将坚持使用它(.select('username name role')
).如果你想让它可重用...只要把字符串变成一个可以通过require
注入的模块中的值。然后你可以在任何需要的地方修改它,并像select(profileFields)
那样使用它。