我对 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)中也经历过相同的效果。
此问题与 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 存储为字符串,因为您可能不需要使用它们执行任何计算。
| 归档时间: |
|
| 查看次数: |
719 次 |
| 最近记录: |