首页 > 解决方案 > MongoDB/Mongoose 保存并获取错误的整数

问题描述

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

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

更奇怪的是,当我现在为同一个文档调用SomeModel.findOne({name: "Pietrov"})findOne

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

我使用的是 mongoose 5.2,尽管我在早期版本 (5.x) 中体验到了相同的效果。

标签: node.jsmongodbmongoose

解决方案


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

Number.MAX_SAFE_INTEGER < 76561198063200688 // true
Number.isSafeInteger(76561198063200688)     // false

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

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


推荐阅读