本文為NoSQL數(shù)據(jù)模型設(shè)計(jì)系列的一部分。
貨幣數(shù)據(jù)需要精確數(shù)據(jù)類型并能夠進(jìn)行精確運(yùn)算睦擂,但是常見的浮點(diǎn)型小數(shù)不支持精確計(jì)算锣吼。這成為貨幣數(shù)據(jù)建模的重要關(guān)注點(diǎn)
在mongodb中一般有兩種模型處理貨幣數(shù)據(jù)
-
數(shù)值模型
當(dāng)需要精確運(yùn)算時(shí)选浑,需要數(shù)值模型,有兩種方式- 采用十進(jìn)制BSON類型
- 采用比例因子
非數(shù)值模型
不需要做精確運(yùn)算時(shí)或可接受近似計(jì)算玄叠,可用非數(shù)值模型
數(shù)值模型
十進(jìn)制BSON類型
mongodb 3.4開始支持decimal BSON類型古徒,它能夠支持精確數(shù)據(jù)存儲(chǔ)和運(yùn)算。
例如读恃,使用NumberDecimal構(gòu)造decimal BSON數(shù)據(jù)
db.gasprices.insert{ "_id" : 1, "date" : ISODate(), "price" : NumberDecimal("2.099"), "station" : "Quikstop", "grade" : "regular" }
采用比例因子
將貨幣數(shù)據(jù)乘以固定的10的方冪轉(zhuǎn)化為64位整形(long BSON類型)隧膘。這里,轉(zhuǎn)化系統(tǒng)10的方冪需要被應(yīng)用記住寺惫,以便能夠?qū)⒋鎯?chǔ)的整形轉(zhuǎn)換回貨幣數(shù)據(jù)疹吃。
例如,9.99美元以1000的比例因子保存為
{ price: 9990, currency: "USD" }
非數(shù)值模型
非數(shù)值模型使用兩個(gè)字段保存貨幣數(shù)據(jù)
a. 采用非數(shù)值類型例如string或BinData保存精確數(shù)據(jù)
b. 采用浮點(diǎn)型例如double保存近似數(shù)據(jù)
例如
{
price: { display: "9.99", approx: 9.9900000000000002, currency: "USD" },
fee: { display: "0.25", approx: 0.2499999999999999, currency: "USD" }
}
近似值字段用來范圍過濾或排序西雀,精確值字段用于顯示或進(jìn)一步處理萨驶。
完整內(nèi)容請(qǐng)查看NoSQL數(shù)據(jù)模型設(shè)計(jì)系列