该数字大于 9223372036854775807 - 对于 NumberLong 来说太大了,NumberLong 是 mongo 的原生 64 位长类型。执行此操作的最佳方法/最佳字段类型是什么?
是否可以保留较小整数(例如
{$lt}
)的任何查询功能?
大数字是由 bignumber.js 生成的,我正在使用 mongoose 与 mongoDb 交互。
恐怕唯一可行/安全的选择是将如此大的数字存储为
string
,并在读/写时在应用程序和 MongoDB 之间来回序列化。但是,您将无法使用处理数字的 MongoDB 内置函数(您仍然可以将值转换为数字,但它不再安全)。
自 MongoDB 3.4 起,可以按照 IEEE 754 规范使用
NumberDecimal
类型(在 MongoDB 和 Mongoose 文档中也记录为 Decimal128
)。
[它]能够按 10^6144 和 10^-6143 的顺序存储最大值和最小值 (来源)
使用 Mongoose 6.6 进行测试:
const mongoose = require('mongoose');
const StatisticsSchema = mongoose.Schema({
someMetric: { type: mongoose.Types.Decimal128, default: 0 },
...
}
在数据库中存储 Decimal128 值需要执行以下操作:
statistic.someMetric = new mongoose.Types.Decimal128(someNumber.toString());
await statistic.save();
在 NodeJS 方面,为了克服
Number
类型限制(64 位整数),如果不需要小数,可以使用内置 BigInt
。总的来说,BigInt
(JS端)和Decimal128
(Mongo端)之间的转换可能很麻烦(例如,您可能必须从从数据库检索的Decimal128
数字中删除尾随的“.0000”),但是这种方法是对于我的用例来说绝对是一个可行的选择。
它支持迄今为止我可以测试的所有 MongoDB 运算符(
$gt
、$lt
...),甚至支持使用 $sum
等运算符的聚合管道。