在MongoDB中提升商店BigDecimal

时间:2015-01-15 15:53:04

标签: mongodb scala lift lift-record

我正在使用MongoDB开发一个电子商务网站

我需要存储一些产品价格数据

我的问题是:

如果我想存储数据类型BigDecimal

,我应该在MongoDB中使用什么字段类型

在mapper中是一个类型的字段:MappedDecimal,但

在net.liftweb.mongodb.record.field中没有等价物

如何存储此信息?

感谢大家的关注和帮助

1 个答案:

答案 0 :(得分:6)

从MongoDB v2.6开始,没有固定位置的十进制类型。数据必须保存在不同类型的字段中,并且应用程序必须每次都执行转换。

中间库可能会执行此转换而不是您的应用程序。我猜net.liftweb.record没有。

如果双重类型足以满足相关字段的需要,为了简单起见,我建议更改为该字段。但假设您使用BigDecimal有充分的理由,那就有众所周知的解决方法。这些是:

(1)将其存储为字符串。你可以有任意精度。但是,只有在每次使用零填充左边的固定长度时,排序或查询精确值匹配才有效。即使这样,正数和负数也是两个不同的范围分类。负数需要反向排序才能进行正确的数字排序。 MongoDB命令的一个示例将自然地返回这些零填充字符串数字:

"-0000054321.9876"
"-0000100322"
"0000054321.9876"
"0000100322"

我相信BigDecimal类型有一个来自字符串值的构造函数,所以这可能是你应用程序翻译函数中最容易实现的。

(2)将其存储为已移位的长(Int64)。排序工作,使用更少的磁盘空间,负面的v.s没有问题。正。需要将值向上移动固定倍数,这使得在直接查看数据库时有点不可读。对于整个集合中的所有值,必须将精度固定为相同 - 对于财务用例;对某些科学用例不行。

(3)存储为一对数字,小数点两边各一个。排序需要额外的小工作。如果使用Int32数字,精度将限制为小数点两边的9位数。查看数据库中的两列而不是一列当然可以多做一些工作。

对于Scala代码示例,我发现MongoDB项目的Reactive驱动程序已记录three serialization workarounds for BigDecimal。第一个使用双;后两种方法采用另一种方法 - 为BigDecimal值创建一个完整的子文档。我怀疑,试图查询包含在子文档中的值将是棘手的。

来自Ebay开发团队博客(Morphia / Java)的

Another real-life case


P.S。也许MongoDB将来会添加一个小数类型。有一个开放的功能请求,您可以观看/ upvote - https://jira.mongodb.org/browse/SERVER-1393