node.js - MongoDB/Mongoose 保存并获取错误的整数
问题描述
我有一个非常奇怪的猫鼬错误 - 每次我尝试保存大量数字(在本例中为 76561198063200687)时,猫鼬或 mongodb 都会错误地保存整数。
例如,当我打电话时SomeModel.findOneAndUpdate({name: "Pietrov"}, {userid: 7656119806320068**7**})
,该字段userid
正在更新为 7656119806320068 8。
更奇怪的是,当我现在为同一个文档调用SomeModel.findOne({name: "Pietrov"})
findOne时(
有人可以帮我解决这个奇怪的问题吗?
我使用的是 mongoose 5.2,尽管我在早期版本 (5.x) 中体验到了相同的效果。
解决方案
此问题与 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 存储为字符串,因为您可能不需要对它们执行任何计算。
推荐阅读
- r - 我们如何找到与列的特定数据点最近的行?
- android - 我是第一次来,不能使用 Admob 实现,有些错误
- c - g++ Mac Curl 架构 x86_64 的未定义符号
- php - 在laravel 6中返回带有状态码和数据的json响应
- r - R包knitr无法打开png()设备
- node.js - 我以前工作的 node/express/mongoose 服务器运行良好,现在它发出一个奇怪的错误
- google-chrome - http://reload.extensions 未找到 IP 地址
- assembly - 将汇编转换为十六进制。如何一步一步做到这一点?
- bash - Bash IF 检查确切的数字是否在列表中
- python - 2D 随机游走,python