在Keystone中“保存”后向mongo添加新属性

时间:2017-10-11 20:11:08

标签: mongodb keystonejs

我最近发现如何在使用Keystone JS(How to alter a value before storing it to the database in Keystone JS)时更改现有属性的值并将其保存到mongo数据库。

现在我需要添加一个新属性,并在同一pre('save')阶段将其保存到数据库中。

目的是说,如果游戏的结果(现有属性)是'赢',那么添加一个新属性'won',这是一个布尔值(true)。如果重要的话,我想要这个的原因是因为在车把模板中我想说{{#if won}}class="success"{{/if}}

Game.schema.pre('save', function(next) {
    if (this.isModified('result')) {
        if (this.result === 'Won') {
            this.won = true;
        }
    }
    next()
});

但没有任何反应。我读过你不能添加属性,除非它们已在模式中设置。所以我尝试在上面添加Game.schema.set('won', false);,但仍然没有。

有一种简单的方法吗?

1 个答案:

答案 0 :(得分:1)

您可以查看Mongoose virtuals ,这些属性可以获取并设置但不会持久保存到数据库中:

Game.schema.virtual('won').get(function() {
  return this.result === 'Won'
})

http://mongoosejs.com/docs/guide.html#virtuals

如果您只是想在模板中使用它,那么您还可以在视图中的当地人上设置特定属性。

也许是这样的:

...

exports = module.exports = function(req, res) {

  var view = new keystone.View(req, res)

  var locals = res.locals

  locals.games = []

  view.on('init', function(next) {

    var query = {} // Add query here

    Game.model.find(query).exec(function(err, games) {

      // Handle error

      games.forEach(function(game) {
        game.won = game.result === 'Won'
      })

      locals.games = games

    })

  })

}

...