mongoose精益查询,虚拟未显示

时间:2013-08-21 16:59:38

标签: mongoose

我在mongoose上设置了以下架构,我使用版本3.6.17:

var PostSchema = new Schema({
    _id: { type: String, required: true, index: { unique: true } },
    video: { type: String, default: ''},
    cover: { type: String, default: ''},
    createdAt: { type: Date, default: Date.now },
    lastUpdate: { type: Date, default: Date.now }
    }, { autoIndex: true, toObject: { virtuals: true }, toJSON: { virtuals: true } });

以下虚拟内容:

PostSchema.virtual('replied').get(function () {
    return false;
});

PostSchema.virtual('cover_url').get(function () {
    return config.cover.server + this.cover;
});

PostSchema.virtual('video_url').get(function () {
    return config.video.server + this.video;
});

当我进行汇总查询时:

Post.aggregate(  { $match:  { replyTo: { $ne: "" }, author: user._id,  draft: false } },
                    { $project: {
                            _id: 1,
                            video: 1,
                            video_url: 1,
                            cover: 1,
                            cover_url: 1,
                            createdAt: 1,
                            lastUpdate: 1,
                            Ireplied : { $not: "$replied"} }
                          }, function ( ) ....

此时虚拟返回但是它们返回属性this.cover或this.video undefined。

当我做一个Post.findOne(..)。lean()。populate(...)等,我根本没有得到虚拟,也没有Post.find()。lean()。populate (...)

我在Post模式上遗漏了什么,能够返回虚拟内容,还是我做错了什么? 为什么使用聚合操作,虚拟会将值“this.cover”返回为undefined?

谢谢!

2 个答案:

答案 0 :(得分:22)

lean查询将原始MongoDB驱动程序响应作为普通js对象返回。因此,其中没有getterssettersvirtuals或其他“猫鼬魔法”。有关详细信息,请参阅Api docs

lean查询的要点是尽快返回您的对象。如果您需要virtuals - 请使用普通的Mongoose查询。

至于聚合,它是100%MongoDB功能,而Mongoose无法控制它。因此,当您从Mongoose调用aggregate时,它与aggregate控制台中的MongoDB的工作方式相同。 aggregate无法与虚拟机一起运行,因为数据库中没有此类字段。 Mongoose甚至无法根据您的模式转换聚合查询(就像它使用findOneAndUpdate参数一样),因为聚合会在每一步上更改文档的形状。有关详细信息,请参阅Mongoose API DocsMongoDB Docs

答案 1 :(得分:1)

我找到了可以使用mongoose-lean-virtuals插件的解决方案

https://www.npmjs.com/package/mongoose-lean-virtuals