需要在MongoDB中存储高精度十进制值

Pet*_*gne 8 c# decimal mongodb

我对MongoDB没什么经验.我经常在大型SQL服务器DB上工作.

MongoDB只支持double,没有小数.C#驱动程序将小数序列化为字符串.

  • 如果我将小数字存储为MongoDB中的字符串,我会错过什么功能?

  • 有没有办法将小数的默认序列化设置为double(AllowTruncation)而不必在每个属性上放置属性?

  • 如果我使用Bson双倍,我会失去什么精确度?

谢谢你的帮助!

UPDATE

我有一个在C#中使用小数的现有应用程序模型.我想将MongoDB用作新的数据库层,并尽可能在现有应用程序中进行更改.这就是为什么我在寻找一种方法将C#中的小数映射到MongoDB中加倍.
我明白我的精确度会下降,并且必须分析它的副作用.我唯一剩下的问题是要知道是否有办法将小数的默认序列化设置为double.

再次感谢.到目前为止很棒的答案和评论.

Sal*_*ali 7

我将部分回答你的问题(因为我对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
Run Code Online (Sandbox Code Playgroud)

关于第二个子问题:

有没有办法将小数的默认序列化设置为double(AllowTruncation)而不必在每个属性上放置属性?

我真的不明白它,所以我希望有人能够回答它.


Dar*_*tar 6

从Mongodb 3.4和2.4 Mongodb C#驱动程序开始,支持十进制类型.

文档的[BsonRepresentation(BsonType.Decimal128)]属性必须具有在MongoDB.Bson.Serialization.Attributes命名空间中找到的属性.

这将映射到"YourDecimalValue" : NumberDecimal("100.0000")MongodDB.Robomongo支持1.1版Beta版的新十进制类型.