Mongoose填充虚拟而不是整个Schema

时间:2015-10-05 12:02:31

标签: javascript node.js mongodb mongoose

我正在尝试.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
    };
});

我必须遗漏一些东西......阅读文档,一切似乎都很好。

1 个答案:

答案 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是合适的。