2017-10-11 71 views
0

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

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

其目的是说,如果游戏的结果(现有属性)是'Won',那么添加一个新的属性'won',这是一个布尔值(真)。如果它的事项,我想这样做的原因是因为在车把模板我想说{{#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

你可以看看猫鼬虚函数这是你可以获取和设置,但没有得到保存到数据库属性:

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 

    }) 

    }) 

} 

... 
+0

谢谢,这看起来很有趣。 'locals.won'将在整个结果上设置,而不是每个结果。会有一种方法来循环每个结果并为每个结果添加属性到当地人吗? – davidpauljunior

+1

我编辑了我的答案来查找多个游戏,并将** won **属性添加到每个游戏中。希望这可以帮助。 –

相关问题