我对 MongoDB 的经验很少。我通常从事大型 SQL Server 数据库的工作。
MongoDB 仅支持 double 和没有小数。 C# 驱动程序将小数序列化为字符串。
如果我将小数存储为字符串,我会错过什么功能
MongoDB?
有没有办法将小数的默认序列化设置为双精度
(AllowTruncation)而不必在每个上放置一个属性
财产?
如果我使用 Bson double,精度会损失什么?
感谢您的帮助!
UPDATE
我有一个在 C# 中使用小数的现有应用程序模型。我想使用 MongoDB 作为新的数据库层,并尽可能少地对现有应用程序进行更改。这就是为什么我正在寻找一种绘制地图的方法decimals在 C# 中double在 MongoDB 中。
我知道我失去了精确性,并且必须分析它的副作用。我唯一剩下的问题是知道是否有办法将小数的默认序列化设置为双精度。
再次感谢。到目前为止很好的答案和评论。
我会部分回答你的问题(因为我对C#不太了解)。
那么,如果将小数存储为字符串,您会失去什么。
- 你的平均数字会更重(每个双数字需要 8 个字节来存储这意味着每个超过 8 个字符的字符串的权重会更大)。由于这些,你的索引(如果它们建立在这个字段上将会增长)
- 您将无法使用以数字作为参数的运算符$inc, $bit, $mod, $min, $max并且在2.6版本中$mul。 (可能是我忘记了什么)
- 您将无法比较数字(可能“1.65”和“1.23”可以作为字符串进行比较,但绝对不能比较带有 e 和减号的数字)。由于此操作建立在比较之上,例如$sort,以及所有这些$gte、$gt、$lte、$lt将无法正常工作。
如果将小数存储为 double,精度会损失多少:
- 基于this,C# 中的十进制有 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
关于第二个子问题:
有没有办法将小数的默认序列化设置为双精度
(AllowTruncation)而不必在每个属性上放置属性?
我实在是不太明白,所以希望有人能够解答。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)