MongoDB/Mongoose 保存并获取错误的整数

1 mongoose mongodb node.js

我对 mongoose 遇到了一个非常奇怪的逐一错误 - 每次我尝试保存大量数字(在本例中为 76561198063200687)时,mongoose 或 mongodb 都会错误地保存整数。

例如,当我致电 时SomeModel.findOneAndUpdate({name: "Pietrov"}, {userid: 7656119806320068**7**}),该字段userid将更新为 7656119806320068 8

更奇怪的是,当我现在为同一个文档调用 findOne ( SomeModel.findOne({name: "Pietrov"})) 时,用户 ID 是 765611980632006 90 - 相差两倍(已经错误的、相差一的用户 ID)。

有人可以帮我解决这个奇怪的问题吗?

我正在使用 mongoose 5.2,尽管我在早期版本(5.x)中也经历过相同的效果。

dan*_*hko 5

此问题与 mongodb 或 mongoose 无关。这种看似奇怪的行为是由于您的号码不是安全整数而引起的:

Number.MAX_SAFE_INTEGER < 76561198063200688 // true
Number.isSafeInteger(76561198063200688)     // false
Run Code Online (Sandbox Code Playgroud)

JavaScript 中的所有数字都是双精度浮点格式数字。并且这个数字只能安全地表示-(2**53 - 1)和之间的整数2**53 - 1。这意味着如果您使用超出该范围的整数,则可以对它们进行舍入以适合 IEEE-754 表示形式。有关更多信息,请参阅MDN 上的 isSafeInteger 文档。

JavaScript 现在有一种新的任意精度整数类型,称为BigInt。但它们仅在从版本 10.4 开始的节点中受支持。据我了解,猫鼬默认不适用于大整数,因此您可能需要为它们创建自定义架构类型。否则,将此 id 存储为字符串,因为您可能不需要使用它们执行任何计算。

  • 这实际上取决于该字段代表什么。如果它只是用作唯一标识符,那么我认为这并不重要。我能想到的唯一缺点是字符串表示会占用更多空间。另一方面,如果您需要递增它们、进行数字比较或查询特定范围值的记录,那么使用字符串将是一个非常糟糕的主意。 (2认同)