如何在 mongoDb 中存储大于最大 64 位 int 的数字?

问题描述 投票:0回答:2

该数字大于 9223372036854775807 - 对于 NumberLong 来说太大了,NumberLong 是 mongo 的原生 64 位长类型。执行此操作的最佳方法/最佳字段类型是什么?

是否可以保留较小整数(例如

{$lt}
)的任何查询功能?

大数字是由 bignumber.js 生成的,我正在使用 mongoose 与 mongoDb 交互。

javascript node.js mongodb mongoose bson
2个回答
1
投票

恐怕唯一可行/安全的选择是将如此大的数字存储为

string
,并在读/写时在应用程序和 MongoDB 之间来回序列化。但是,您将无法使用处理数字的 MongoDB 内置函数(您仍然可以将值转换为数字,但它不再安全)。


0
投票

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
等运算符的聚合管道。

© www.soinside.com 2019 - 2024. All rights reserved.