首页 > 解决方案 > Mongoose remove a Schema property after creating virtual property

问题描述

I am creating a groupedMenu virtual property that replaces the need for my menu property.

So once I am done mapping my virtual property, I want to delete the menu key in my Schema.

Example Schema:

 new Schema({
    menu: [{
      category: String
    }]
 })

Example virtual category being created:

Restaurants.virtual('groupedMenu')
    .get(function () {
        return _.groupBy(this.menu, menu => menu.category);
    });

I've tried deleting the menu in my route, but it does not work. Example:

router.get('/someRoute', function (req, res) {
    Schema.findOne({})
        .then(menuStuff => {
            delete menuStuff.menu // THIS DOES NOT WORK
            return res.status(200).json(menuStuff);
        })

How can I delete my menu key after my my virtual property groupedMenu has been created?

标签: javascriptnode.jsmongoose

解决方案


我看到的问题很少。

  1. Schema.findOne({})看起来很奇怪。应该是Model.findOne({})

  2. 的同义词virtualgetter。这意味着当您调用object.groupedMenu虚拟方法时,它会被执行。换句话说,每次调用时都会groupedMenu使用。不创建虚拟属性,它们始终在运行时执行。menu.groupedMenu

我的建议是覆盖Schema.toObject它,使其没有.menu

Schema.set("toObject", {
    virtuals: true,
    transform(doc, ret) {
        ret.id = ret._id;
        delete ret.menu;
    }
});

并在您的代码中使用它:

return res.status(200).json(menuStuff.toObject());

推荐阅读