mongoose 如何在mongoDb中存储大于max 64 bit int的数字?

zc0qhyus  于 12个月前  发布在  Go
关注(0)|答案(2)|浏览(137)

这个数字大于9223372036854775807 -对于NumberLong来说太大了,NumberLong是mongo原生的64位长类型。最好的方法是什么/最好的字段类型?
是否可以保留较小整数(例如{$lt})的任何查询功能?
大的数字是由bignumber.js生成的,我使用mongoose与mongoDb交互。

x0fgdtte

x0fgdtte1#

恐怕唯一可行/安全的选择是将如此大的数字存储为string,并在读写时在应用程序和MongoDB之间来回序列化它。然而,您将失去使用MongoDB内置函数处理数字的能力(您仍然可以将值转换为数字,但它不再安全)。

a2mppw5e

a2mppw5e2#

MongoDB 3.4开始,可以在IEEE 754 spec之后使用NumberDecimal类型(在MongoDB和Mongoose文档中也称为Decimal128)。
支持10^614410^-6143量级的最大值和最小值存储,支持34位小数精度(source)。
使用Mongoose 6.6测试:

const mongoose = require('mongoose');

const StatisticsSchema = mongoose.Schema({
    someMetric: { type: mongoose.Types.Decimal128, default: 0 },
    ...
}

字符串
在DB中存储Decimal 128值需要执行以下操作:

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”),然而,这种方法对于我用例来说绝对是一个可行的选择。

相关问题