Mongodb 如何在将值存储到Keystone JS中的数据库之前更改该值

Mongodb 如何在将值存储到Keystone JS中的数据库之前更改该值,mongodb,keystonejs,Mongodb,Keystonejs,Keystone和mongo对我来说都是新手,所以我不确定如何操作数据 我有一个Keystone列表,其中有一个模型(/models/Game.js),如下所示: var keystone = require('keystone'); var Types = keystone.Field.Types; var Game = new keystone.List('Game'); Game.add({ odds: { type: Types.Text, required: true, i

Keystone和mongo对我来说都是新手,所以我不确定如何操作数据

我有一个Keystone列表,其中有一个模型(
/models/Game.js
),如下所示:

var keystone = require('keystone');
var Types = keystone.Field.Types;

var Game = new keystone.List('Game');

Game.add({
    odds: { type: Types.Text, required: true, initial: true},
});

Game.track = true;
Game.defaultSort = '-createdAt';
Game.defaultColumns = 'odds';
Game.register();
赔率字段是一个字符串,例如
3/1
,我想通过一个函数来运行它,该函数将其拆分并返回十进制版本,例如:

function decimalOdds(fraction) {
    const splitFields = fraction.split('/');
    return ((splitFields[0] / splitFields[1]) + 1).toFixed(2);
}

它是那个函数的返回值,我想在数据库中存储为“赔率”。这可能吗?

您可以使用预保存挂钩:

Game.schema.pre('save', function(next) {
  if (this.isModified('odds')) {
    this.odds = decimalOdds(this.odds)
  }
  next()
})
您可以在文档的模式插件部分阅读更多内容:

您还可以在此处找到有关Mongoose模式挂钩的更多信息:

您可以使用预保存挂钩:

Game.schema.pre('save', function(next) {
  if (this.isModified('odds')) {
    this.odds = decimalOdds(this.odds)
  }
  next()
})
您可以在文档的模式插件部分阅读更多内容:

您还可以在此处找到有关Mongoose模式挂钩的更多信息:

谢谢!在阅读了Keystone schema文档并测试了一些东西之后,我注意到如果我使用
Post.schema.methods.decimalloffics=function(fraction){…}
this.decimalloffics(this.loffics)
结合使用,或者如果我只是定义一个普通函数,比如
function decimalloffics(fraction){…},则没有什么区别
并通过
小数点赔率(this.赔率)
来调用它。这两种方法有区别吗?没问题。创建Mongoose实例方法将允许您在任何有模型实例的地方使用该方法,因此如果您在应用程序的其他地方使用模型并且需要该功能,这可能会很有用。太棒了。对不起,最后一件事(不小心把我的问题扩大了一点)。如果您有多个
pre
钩子,它们是否都在同一个
Game.schema.pre
中,或者每个钩子都有这个完整的块?是的,您可以有多个pre-save块,并且在前一个钩子完成时(调用next()时),每个钩子都会触发。他们应该按照规定的顺序开火。如果您愿意,也没有理由不在一个块中添加其他功能。谢谢!在阅读了Keystone schema文档并测试了一些东西之后,我注意到如果我使用
Post.schema.methods.decimalloffics=function(fraction){…}
this.decimalloffics(this.loffics)
结合使用,或者如果我只是定义一个普通函数,比如
function decimalloffics(fraction){…},则没有什么区别
并通过
小数点赔率(this.赔率)
来调用它。这两种方法有区别吗?没问题。创建Mongoose实例方法将允许您在任何有模型实例的地方使用该方法,因此如果您在应用程序的其他地方使用模型并且需要该功能,这可能会很有用。太棒了。对不起,最后一件事(不小心把我的问题扩大了一点)。如果您有多个
pre
钩子,它们是否都在同一个
Game.schema.pre
中,或者每个钩子都有这个完整的块?是的,您可以有多个pre-save块,并且在前一个钩子完成时(调用next()时),每个钩子都会触发。他们应该按照规定的顺序开火。如果您愿意,也没有理由不在一个块中添加其他功能。