我应该如何将价格存入mongoose?

我使用mongoose模式与node.js一起使用了express-validator(它具有节点validation器santiziations和validation器)。

什么是存储物品价格的好方法?

我现在有

var ItemSchema = new Schema({ name : { type: String, required: true, trim: true } , price : Number }); 

价格是可选的,所以我有:

  if ( req.body.price ) { req.sanitize('price').toFloat(); req.assert('price', 'Enter a price (number only)').isFloat(); } 

expression式validation器给我isNumeric(允许0填充),isDecimal,isInt …我宁愿只是转换为十进制和剥离所有字符,所以我总是插入42.00分贝。

我想让他们input42.00美元,42美元,42美元,42.00美元,只是存储42.00。 我怎样才能做到这一点? 并仍然validation我看到类似于数字的东西,例如,如果他们input'abc'我想要使用req.assert将错误返回到表单。

另外,我想货币最终会成为一个问题…

更新,我发现这个职位,说存储价格以美分整数,所以4200 https://dba.stackexchange.com/questions/15729/storing-prices-in-sqlite-what-data-type-to-use

当我打电话给item.price时,我只需要一种将4200转换为$ 42.00的方法,并将input清理并转换为4200。

提示:这里描述的方法基本上就是chovy的答案的另一个实现。

Mongoose 3&4的解决方法:

如果你在模式中直接定义getter和setter有困难,你也可以使用schema.path()函数来完成这个工作:

 var ItemSchema = new Schema({ name: String, price: Number }); // Getter ItemSchema.path('price').get(function(num) { return (num / 100).toFixed(2); }); // Setter ItemSchema.path('price').set(function(num) { return num * 100; }); 

这就是我最终做的

我将价格存储为数据库中的美分,因此,如49.99所示,这是4999: https : //dba.stackexchange.com/questions/15729/storing-prices-in-sqlite-what-data-type-to-use

getPrice会将其转换回可读格式,所以我可以在我的视图中使用item.price而不用修改它。

setPrice将其转换为分。

模型:

 var ItemSchema = new Schema({ name : { type: String, required: true, trim: true } , price : {type: Number, get: getPrice, set: setPrice } }); function getPrice(num){ return (num/100).toFixed(2); } function setPrice(num){ return num*100; } 

我select只允许价格字段中的数字和小数,没有$。 所以他们可以input49,49.99,49.00,但不是49.0或49

使用正则expression式进行validation:

 if ( req.body.price ) { req.assert('price', 'Enter a price (numbers only)').regex(/^\d+(\.\d{2})?$/); } 

我希望有一种方法来允许$,因为我认为它是一个可用性问题,只是让用户input它,但剥离它。 我不知道如何做到这一点,并仍然validation我们有一个价格,而不是一堆字母例如。

将模式types“货币”添加到mongoose处理钱。 自动除去常见字符(“,”,“$”和字母字符)

https://github.com/paulcsmith/mongoose-currency

它能做什么:

将string保存为整数(通过去除非数字并乘以100),以防止执行计算时的舍入错误(请参阅细节)从string的开头删除符号(有时用户包含货币符号)删除逗号(有时用户添加逗号或将粘贴值复制到表单中,例如“1,000.50”仅保存小数点后的两位数字(“$ 500.559”转换为50055且不轮)string[a-zA-Z]通过一个string或一个数字,数字将按原样存储假设如果你设置的值为一个整数,你已经完成了转换(例如50000 = 500.00美元)如果一个浮点数被传入,将它舍入(500.55 – > 501)。只要传入整数是安全的。

希望它有助于一些。

我一直在研究这个话题,因为我想存储的不仅仅是价格,而是版本,这两个版本都可能有尾随0,在存储为数字时被截断。 据我所知,Mongoose / MongoDB不能保存尾随零的数字。

除非将该数字保存为string。

除了以数十或数千存储数字以及分割或parsing外,还可以将其存储为string。 这意味着,只要使用variables而不需要任何转换,只需要显示“1.0”或“1.00”,就可以随时打印出来。 由于JavaScript是无types的,您仍然可以将其与数字进行比较(确保它在左侧)。 例如,Var <10将返回正确的评估,即使var是一个string。 如果你比较两个variables,你需要确保它们都是数字。 当你需要一个数字的时候,你可以把string乘一(var * 1 <var2 * 1),这样可以确保JavaScript将var作为一个数字,尽pipe它会丢失后面的零。

一方面,将其存储为string意味着每次要将variables用作数字时都需要进行转换。 另一方面,无论如何,你可能会进行一次数字转换(var / 100),每次你想用一个美分数作为美元数量。 这个选项将取决于你需要多less次你的价值作为一个数字。 如果你忘记你的variables是一个string,而不是你忘记你的variables是以分为单位的话,那么它可能会导致更大的错误。

(但是,这对于只能用于显示和比较的版本号非常适合。)

数字模块将完成: http : //numeraljs.com/ https://www.npmjs.com/package/numeral