MongoDB在尝试插入整数时会插入float


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

我如何让Mongo插入整数?

谢谢


您使用哪个版本的mongodb?
kamaradclimber 2011年


1
请注意,在我的情况下,当我想在已经设置为Long的某个“ val”处{$ set:{val:NumberInt(0)}}时,它并没有改变。我必须首先将其更改为其他值,然后将其更改回0,以使NumberInt(0)生效
kommradHomer 2016年

我遇到了同样的问题,在意识到我错误地将int32更改为double以后,除非我先将其更改为其他值,否则使用NumberInt()将其设置回原先无法修复类型。
user1055568

Answers:


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

您也可以使用NumberLong。


1
但是在findOne中,它说NumberLong(0)不为0
做白日梦的人

11
默认情况下,mongo shell将所有数字视为浮点值。因此,我们需要明确指定要使用的数字类型,例如NumberInt或NumberLong。 docs.mongodb.org/manual/core/shell-types
Yadu

12
我有个问题。NumberInt仅在mongo shell中提供,如何使用JavaScript语言(如node.js)做到这一点?
萧易客2016年

@Shawyeok这是一个答案stackoverflow.com/a/21870772/3815843
GRiMe2D

重要的是要考虑到整数有界限。如果数字很大,请考虑使用NumberLong
Tim Givois,2016年

17

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

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

5

如果值类型已经是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中有效,所以也许这是一个错误。
Cerberus

-10

好吧,它是JavaScript,因此“值”中包含的数字是数字,可以是整数或浮点数。但是JavaScript并没有真正的区别。通过学习JavaScript

数字数据类型

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


27
其实那是不对的。虽然JS没有什么区别,但是当您从另一种语言(例如Java)连接到mongo时,您将很快感受到这种区别。
Omri Spector

2
我的应用程序仅在一个不同的点中断过,原因只有一个,int被保存并以float形式返回。我怀疑原因一定是我通过使用JavaScript的mongo shell进行的一些手动插入。
梅尔西(Melsi)2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.