mongoose精益查询,虚拟不显示

mongoose精益查询,虚拟不显示,mongoose,Mongoose,我在mongoose上设置了以下模式,Im使用版本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:

我在mongoose上设置了以下模式,Im使用版本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 ( ) ....
此时virtuals返回,但返回的属性this.cover或this.video未定义

当我做一个Post.findOne(..).lean().populate(…)等的时候,我根本没有得到虚拟的东西,Post.find().lean().populate(…)

我是否在Post模式中遗漏了一些东西,以便能够返回虚拟结果,或者我做错了什么? 为什么在聚合操作中,virtuals返回未定义的值“this.cover”


谢谢大家!

lean
查询将原始
MongoDB
驱动程序响应作为普通
js
对象返回。因此,它没有
getter
setter
virtuals
或其他“猫鼬魔法”。有关更多信息,请参阅

lean
查询的要点是尽可能快地返回对象。如果需要
virtuals
,请使用普通猫鼬查询


至于聚合,它是100%的MongoDB特性,Mongoose无法控制它。因此,当您从Mongoose调用
aggregate
时,它的工作原理与
MongoDB
控制台中的
aggregate
相同
aggregate
无法与virtuals一起操作,因为您的数据库中没有此类字段。Mongoose甚至不能根据您的模式强制转换聚合查询(就像它对
findOneAndUpdate
参数所做的那样),因为聚合会在每个步骤上更改文档的形状。有关更多信息,请参阅和。

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


Hi,实际上我得到了虚拟,并用聚合查询和普通查询对它们进行了修改,我确实去掉了精简部分,一切正常,但我从填充字段中得到了一个奇怪的重复id和id字段,还得到了填充字段上的封面url和视频url,我不想要这些字段,如何删除这些字段,在填充选择选项中,我不请求这些字段!