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

时间:2018-07-28 22:00:57

标签: node.js mongodb mongoose

我在猫鼬中遇到了一个非常奇怪的一次性错误-每次我尝试保存大量数字(在这种情况下为76561198063200687)时,猫鼬或mongodb错误地保存了整数。

例如,当我呼叫SomeModel.findOneAndUpdate({name: "Pietrov"}, {userid: 7656119806320068**7**})时,字段userid被更新为7656119806320068 8

更奇怪的是,当我为同一文档 now SomeModel.findOne({name: "Pietrov"}))调用findOne时,用户ID为765611980632006 90 -减少了两个(已经错了,由一个用户ID隔开。)

有人可以帮助我解决这个令人毛骨悚然的问题吗?

我正在使用猫鼬5.2,尽管我在早期版本(5.x)中也有相同的效果。

1 个答案:

答案 0 :(得分:3)

此问题与mongodb或mongoose无关。您的电话号码不是安全整数的事实引起的这种看似怪异的行为:

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

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

JavaScript现在为称为BigInt的任意精度整数提供了一种新类型。但是它们仅在节点starting from version 10.4中受支持。据我了解,猫鼬默认情况下不适用于大整数,因此您可能需要为其创建一个custom schema type。否则,请将这些id存储为字符串,因为您可能不需要使用它们执行任何计算。