statistic.someMetric = new mongoose.Types.Decimal128(someNumber.toString());
await statistic.save();
型 它支持到目前为止我可以测试的所有MongoDB操作符($gt,$lt...),甚至包括$sum等操作符的聚合管道。 在NodeJS方面,为了克服Number类型限制,(safe integers up to 2^53-1, i.e. ~9 quadrillions),如果你不需要小数,你可以使用内置的BigInt。总的来说,BigInt(JS端)和Decimal128之间的转换(蒙哥方)可麻烦了(例如,您可能必须从从数据库检索的Decimal128数字中删除尾随的“.0000”),然而,这种方法对于我用例来说绝对是一个可行的选择。
2条答案
按热度按时间x0fgdtte1#
恐怕唯一可行/安全的选择是将如此大的数字存储为
string
,并在读写时在应用程序和MongoDB之间来回序列化它。然而,您将失去使用MongoDB内置函数处理数字的能力(您仍然可以将值转换为数字,但它不再安全)。a2mppw5e2#
从MongoDB 3.4开始,可以在IEEE 754 spec之后使用
NumberDecimal
类型(在MongoDB和Mongoose文档中也称为Decimal128
)。支持10^6144和10^-6143量级的最大值和最小值存储,支持34位小数精度(source)。
使用Mongoose 6.6测试:
字符串
在DB中存储Decimal 128值需要执行以下操作:
型
它支持到目前为止我可以测试的所有MongoDB操作符(
$gt
,$lt
...),甚至包括$sum
等操作符的聚合管道。在NodeJS方面,为了克服
Number
类型限制,(safe integers up to 2^53-1, i.e. ~9 quadrillions),如果你不需要小数,你可以使用内置的BigInt
。总的来说,BigInt
(JS端)和Decimal128
之间的转换(蒙哥方)可麻烦了(例如,您可能必须从从数据库检索的Decimal128
数字中删除尾随的“.0000”),然而,这种方法对于我用例来说绝对是一个可行的选择。