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

时间:2013-11-17 21:40:14

标签: c# mongodb decimal

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

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

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

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

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

感谢您的帮助!

更新

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

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

2 个答案:

答案 0 :(得分:7)

我会部分回答你的问题(因为我对C#了解不多)。

那么如果你将小数作为字符串存储,你会失去什么。

  • 您的数字平均会增加重量(每个双数cost 8 bytes to store,这意味着每个字符串有超过8个字符的权重会更多)。因为这些索引(如果它们将构建在这个领域上会增长)
  • 您将无法使用将数字作为参数$inc$bit$mod$min$max和2.6版{{ {3}}。 (可能是我忘记了什么)
  • 你将无法比较数字(可能是'1.65'和'1.23'是一个字符串,但绝对不是数字,其中e和minus介于两者之间)。由于这些操作构建在比较之上,例如$mul,因此所有这些$sort都无法正常工作。

如果将十进制存储为双精度,您将失去什么精确度:

    基于$gte, $gt, $lte, $lt
  • 有28-29位有效数字,而在查看我的第一个链接并检查this, Decimal in C#时,您会看到它有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),而不必在每个属性上放置一个属性?

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

答案 1 :(得分:6)

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

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

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