需要在MongoDB中存储高精度十进制值
我对MongoDB没什么经验。 我经常在大型SQL服务器DB上工作。
MongoDB只支持double, 没有小数 。 C#驱动程序将小数序列化为字符串。
-
如果我将小数作为字符串存储在MongoDB中,我会错过什么function?
-
有没有办法将小数的默认序列化设置为double(AllowTruncation)而不必在每个属性上放置一个属性?
-
如果我使用Bson双倍,我会失去什么精确度?
谢谢你的帮助!
UPDATE
我有一个在C#中使用小数的现有应用程序模型。 我想将MongoDB用作新的数据库层,并尽可能在现有应用程序中进行更改。 这就是为什么我在寻找一种方法将C#中的小数映射到MongoDB中加倍 。
我明白我的精确度会下降,并且必须分析它的副作用。 我唯一剩下的问题是要知道是否有办法将小数的默认序列化设置为double。
再次感谢。 到目前为止很棒的答案和评论。
我将部分回答你的问题(因为我对C#了解不多)。
那么如果你将小数作为字符串存储,你会失去什么。
- 平均而言,你的数字会增加权重(每个双数字需要花费8个字节才能存储 ,这意味着每个字符串有超过8个字符的权重会更多)。 因为这些你的索引(如果它们将建立在这个领域上会增长)
- 您将无法使用将数字作为参数$ inc , $ bit , $ mod , $ min , $ max和2.6版本$ mul的运算符。 (可能是我忘记了什么)
- 你将无法比较数字(可能是’1.65’和’1.23’是一个字符串,但绝对不是数字,其中e和minus介于两者之间)。 由于这种操作构建在比较之上,比如$ sort ,所有这些$ gte,$ gt,$ lte,$ lt将无法正常工作。
如果将十进制存储为double,您将失去什么精度 :
- 基于此,C#中的Decimal有28-29位有效数字,而查看我的第一个链接并检查双精度的规格,你会发现它有15-17位有效数字。 这基本上就是你将失去的
- 人们在处理双浮动时有时会忘记的另一个非常重要的事情如下图所示:
。
db.c.insert({_id : 1, b : 3.44}) db.c.update({_id : 1},{$inc : {b : 1}}) db.c.find({b: 4.44}) // WTf, where is my document? There is nothing there
关于第二个子问题:
有没有办法将小数的默认序列化设置为double(AllowTruncation)而不必在每个属性上放置一个属性?
我真的不明白它,所以我希望有人能够回答它。
从Mongodb 3.4和2.4 Mongodb C#驱动程序开始,支持十进制类型。
文档的属性必须具有MongoDB.Bson.Serialization.Attributes
命名空间中的[BsonRepresentation(BsonType.Decimal128)]
属性。
这将映射到"YourDecimalValue" : NumberDecimal("100.0000")
中的"YourDecimalValue" : NumberDecimal("100.0000")
。 Robomongo支持1.1版Beta版的新十进制类型。