【问题标题】:MongoDB inserts float when trying to insert integerMongoDB 在尝试插入整数时插入浮点数
【发布时间】:2011-11-21 21:00:37
【问题描述】:
   > 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() 将其重新设置并不能修复类型,除非我首先更改为不同的值。

标签: mongodb


【解决方案1】:
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
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    如果值类型已经是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 中工作,所以也许这是一个错误。
    【解决方案4】:

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

    数字数据类型

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

    【讨论】:

    • 其实不是这样的。虽然 JS 看不出有什么不同,但只要你从另一种语言(例如 java)连接到 mongo,你就会感受到很大的不同。
    • 我的应用程序在不同点出现故障仅出于一个原因,int 被保存并作为浮点数返回。我怀疑原因一定是我通过使用 javascript 的 mongo shell 进行的一些手动插入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 2021-01-04
    • 2016-08-18
    • 1970-01-01
    相关资源
    最近更新 更多