我正在尝试.populate
一个特定的模型,但它似乎忽略了第二个select
命令,如果它是虚拟 ......
// This won't work - it just returns the _id meaning it didn't populate
.populate({ path: 'user', select: 'post' }) // Post is a : virtual('post')
.populate('user', 'post') // Also doesn't work
// If I manually select all the fields the virtual does, that works of course
.populate({ path: 'user', select: '_id name image type' })
这是我在User对象上创建的虚拟
// Here's the relating parts of the Model
var UserSchema = new Schema({
name : String,
type: {},
image : String
});
// Here's the virtual
UserSchema
.virtual('post')
.get(function () {
return {
'_id' : this._id,
'name' : this.name,
'type' : this.type,
'image' : this.image
};
});
我必须遗漏一些东西......阅读文档,一切似乎都很好。
答案 0 :(得分:1)
Mongoose不承诺用select attribtue填充虚拟文件,文档也没有说什么。看来,一般都是手动工作。
您可以在UserScheme
上创建适合情况的常量变量,而不是使用虚拟变量。它可以返回select的字符串。
UserScheme.getPostFields = "_id name image type"; // under UserScheme
// pass on select method
.populate({ path: 'user', select: UserScheme.getPostFields });
此方法可能很奇怪,但如果需要,您也可以动态更改此情况。
顺便说一下,对于这种情况,npm mongoose-populate-virtuals是合适的。