猫鼬创建虚拟属性后删除架构属性

时间:2019-08-05 01:08:43

标签: javascript node.js mongoose

我正在创建一个groupedMenu虚拟属性,以取代对我的menu属性的需求。

因此,一旦我完成了虚拟属性的映射,我想删除架构中的菜单键。

示例架构:

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

正在创建的虚拟类别示例:

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

我已经尝试删除路线中的菜单,但是它不起作用。示例:

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

创建虚拟属性menu后,如何删除groupedMenu键?

1 个答案:

答案 0 :(得分:0)

我看到的几个问题。

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

  2. virtual的同义词是getter。这意味着,当您调用object.groupedMenu时,虚拟方法将被执行。换句话说,每次调用groupedMenumenu都在使用.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());