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

Mongodb 在Keystone中的“保存”之后向mongo添加新属性,mongodb,keystonejs,Mongodb,Keystonejs,我最近发现了如何在使用Keystone JS时更改现有属性的值并将其保存到mongo数据库 现在,我需要添加一个新属性,并在相同的预“保存”阶段将其保存到数据库中 目的是说,如果游戏的结果现有属性为“赢”,则添加一个新属性“赢”,该属性为布尔真。如果这很重要,我之所以希望这样做,是因为在把手模板中,我想说{{If-won}}class=success{{/If}} 但什么也没发生。我了解到,除非在架构中设置了属性,否则无法添加属性。所以我尝试添加Game.schema.set'won',fals

我最近发现了如何在使用Keystone JS时更改现有属性的值并将其保存到mongo数据库

现在,我需要添加一个新属性,并在相同的预“保存”阶段将其保存到数据库中

目的是说,如果游戏的结果现有属性为“赢”,则添加一个新属性“赢”,该属性为布尔真。如果这很重要,我之所以希望这样做,是因为在把手模板中,我想说{{If-won}}class=success{{/If}}

但什么也没发生。我了解到,除非在架构中设置了属性,否则无法添加属性。所以我尝试添加Game.schema.set'won',false;除此之外,还是什么都没有


有一种简单的方法可以做到这一点吗?

您可以查看Mongoose virtuals,它是您可以获取和设置但不会持久化到数据库的属性:

Game.schema.virtual('won').get(function() {
  return this.result === 'Won'
})
如果您只想在模板中使用它,那么您还可以在视图中设置局部变量的特定属性

也许是这样的:

...

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

    })

  })

}

...

谢谢,看起来很有趣。“locals.won”将根据整个结果设置,而不是根据每个结果设置。是否有一种方法可以循环查看每个结果并为每个结果将属性添加到本地?我已经编辑了我的答案,以查找多个游戏并将赢得的属性添加到每个游戏中。希望这有帮助。
...

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

    })

  })

}

...