本文为NoSQL数据模型设计系列的一部分。
货币数据需要精确数据类型并能够进行精确运算,但是常见的浮点型小数不支持精确计算。这成为货币数据建模的重要关注点
在mongodb中一般有两种模型处理货币数据
-
数值模型
当需要精确运算时,需要数值模型,有两种方式- 采用十进制BSON类型
- 采用比例因子
-
非数值模型
不需要做精确运算时或可接受近似计算,可用非数值模型
数值模型
十进制BSON类型
mongodb 3.4开始支持decimal BSON类型,它能够支持精确数据存储和运算。
例如,使用NumberDecimal构造decimal BSON数据
db.gasprices.insert{ "_id" : 1, "date" : ISODate(), "price" : NumberDecimal("2.099"), "station" : "Quikstop", "grade" : "regular" }
采用比例因子
将货币数据乘以固定的10的方幂转化为64位整形(long BSON类型)。这里,转化系统10的方幂需要被应用记住,以便能够将存储的整形转换回货币数据。
例如,9.99美元以1000的比例因子保存为
{ price: 9990, currency: "USD" }
非数值模型
非数值模型使用两个字段保存货币数据
a. 采用非数值类型例如string或BinData保存精确数据
b. 采用浮点型例如double保存近似数据
例如
{
price: { display: "9.99", approx: 9.9900000000000002, currency: "USD" },
fee: { display: "0.25", approx: 0.2499999999999999, currency: "USD" }
}
近似值字段用来范围过滤或排序,精确值字段用于显示或进一步处理。
完整内容请查看NoSQL数据模型设计系列
网友评论