Добавление нового свойства в монго после «сохранения» в Keystone

Недавно я узнал, как изменить значение существующего свойства и сохранить его в базе данных mongo при использовании Keystone JS (Как изменить значение перед его сохранением в базе данных в Keystone JS).

Теперь мне нужно добавить новое свойство и сохранить его в базе данных на той же фазе pre('save').

Цель состоит в том, чтобы сказать, что если результатом (существующим свойством) игры является «Выиграл», добавить новое свойство «выиграл», которое является логическим значением (истина). Если это имеет значение, причина, по которой я хочу этого, заключается в том, что в шаблоне руля я хочу сказать {{#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); выше этого, но все равно ничего.

Есть ли простой способ сделать это?


person davidpauljunior    schedule 11.10.2017    source источник


Ответы (1)


Вы можете взглянуть на Mongoose virtuals, которые представляют собой свойства, которые вы можете получить и установить, но которые не сохраняются в базе данных:

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

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

Если вы просто хотите использовать его в своем шаблоне, вы также можете установить определенное свойство для locals в своем представлении.

Возможно что-то вроде этого:

...

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

    })

  })

}

...
person Steve Holgado    schedule 12.10.2017
comment
Спасибо, выглядит интересно. locals.won будет установлен для результатов в целом, а не для каждого результата. Будет ли способ перебрать каждый результат и добавить свойство к локальным для каждого? - person davidpauljunior; 12.10.2017
comment
Я отредактировал свой ответ, чтобы найти несколько игр и добавить свойство won к каждой из них. Надеюсь это поможет. - person Steve Holgado; 12.10.2017