ChatGPT解决这个技术问题 Extra ChatGPT

MongoDB 在尝试插入整数时插入浮点数

   > db.data.update({'name': 'zero'}, {'$set': {'value': 0}}) 
   > db.data.findOne({'name': 'zero})
    {'name': 'zero', 'value': 0.0}  

如何让 Mongo 插入一个整数?

谢谢

你用的是哪个版本的mongodb?
请注意,在我的情况下,当我想 {$set:{val:NumberInt(0)}} 在某个已经设置为 Long 的“val”时,它并没有改变它。我必须先将其更改为其他值,然后将其更改回 0 ,以便 NumberInt(0) 生效
我遇到了同样的问题,在意识到我错误地将 int32 更改为 double 后,使用 NumberInt() 将其重新设置并不能修复类型,除非我首先更改为不同的值。

B
Bernie Hackett
db.data.update({'name': 'zero'}, {'$set': {'value': NumberInt(0)}})

您也可以使用 NumberLong。


但在 findOne 它说 NumberLong(0) not as 0
默认情况下,mongo shell 将所有数字视为浮点值。所以我们需要明确指定我们想要使用的数字类型,例如 NumberInt 或 NumberLong。 docs.mongodb.org/manual/core/shell-types
我有个问题。 NumberInt 仅在 mongo shell 中提供,您如何在 node.js 等 JavaScript 语言中做到这一点?
@Shawyeok 这是一个答案stackoverflow.com/a/21870772/3815843
重要的是要考虑到整数有界限。如果数字很大,请考虑使用 NumberLong
G
Grid Trekkor

一个稍微简单的语法(至少在 Robomongo 中)对我有用:

db.database.save({ Year : NumberInt(2015) });

这是我的代码 getRawPhoneNumber(phoneNumber: string) { let phNumber = phoneNumber.replace(/[^0-9+]/g, ''); return NumberInt(phNumber); },上面写着 找不到NumberInt
E
Ethan. Zhang

如果值类型已经是 double,那么在使用 NumberInt() 或 NumberLong() 函数时,使用 $set 命令更新值不能将值类型 double 更改为 int。因此,要更改值类型,它必须更新整个记录。

var re = db.data.find({"name": "zero"})
re['value']=NumberInt(0)
db.data.update({"name": "zero"}, re)

$set 至少在 Mongo 4.2 中有效,所以这可能是一个错误。
C
Community

嗯,它是 JavaScript,所以你在 'value' 中拥有的是一个数字,它可以是整数或浮点数。但是 JavaScript 并没有真正的区别。从 Learning JavaScript

数字数据类型 JavaScript 中的数字数据类型是浮点数,但它们可能有也可能没有小数部分。如果它们没有小数点或小数部分,它们将被视为整数 - 以 10 为底的整数,范围为 –253 到 253。


其实那不是真的。虽然 JS 看不出有什么不同,但只要你从另一种语言(例如 java)连接到 mongo,你就会感受到很大的不同。
我的应用程序仅出于一个原因在不同点出现故障,int 被保存并作为浮点数返回。我怀疑原因一定是我通过使用 javascript 的 mongo shell 进行的一些手动插入。