【问题标题】:mongoose lean query, virtuals not showing猫鼬精益查询,虚拟不显示
【发布时间】:2013-08-24 04:21:55
【问题描述】:

我在猫鼬上设置了以下架构,我使用的是 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 未定义。

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

我是否遗漏了 Post 架构上的某些内容,以便能够返回虚拟对象,或者我做错了什么? 为什么使用聚合操作时,virtuals 会返回未定义的值“this.cover”?

谢谢!

【问题讨论】:

    标签: mongoose


    【解决方案1】:

    lean 查询将原始 MongoDB 驱动程序响应作为纯 js 对象返回。因此,其中没有getters、setters、virtuals 或其他“猫鼬魔法”。请参阅Api docs 了解更多信息。

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

    至于聚合,它是 100% MongoDB 功能,Mongoose 无法控制它。因此,当您从 Mongoose 调用 aggregate 时,它的工作方式与 MongoDB 控制台中的 aggregate 相同。 aggregate 不能使用虚拟变量,因为您的数据库中没有这样的字段。 Mongoose 甚至无法根据您的模式转换您的聚合查询(就像它使用 findOneAndUpdate 参数所做的那样),因为聚合在每一步都会改变文档的形状。请参阅Mongoose API Docs 和MongoDB Docs 了解更多信息。

    【讨论】:

    • 嗨,实际上我正在获取虚拟变量并使用聚合查询和普通查询实际修改它们,我确实拿出了精益部分并且一切正常,但我得到了一个奇怪的重复 _id 和 id 字段填充的字段,并在我不想要的填充字段上获取cover_url和video_url,如何删除这些字段,在人口选择选项中我不要求那些!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-29
      • 1970-01-01
      • 2019-07-04
      • 2019-10-19
      • 1970-01-01
      • 2017-12-26
      • 2021-01-09
      • 2020-06-02
      相关资源
      最近更新 更多