Be careful when using Number type with mongo shell

本文探讨了MongoDB支持的整型与浮点型数据类型,并对比了这些类型在JavaScript环境下的表现形式。特别强调了在MongoShell中处理int8类型数据可能导致的精度损失问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MongoDB支持三种数据类型:
int4 : 4字节的整型
int8 : 8字节的整型
float8 : 8字节的浮点型

javaScript支持的数据类型 : 
float8 : 8字节浮点型

mongo shell :基于javaScript的人机交互程序.默认情况下任意NUMBER类型都被当成双精类型来处理.
如:在mongo shell中获取一个int4的类型再写回数据库会变成float8的类型,因此在mongo中使用replace的方式更新document是非常不明智的选择(如果document中存在number类型的情况下),在mongo shell中处理数据建议使用更新individual keys的方式,而不是replace整个document.
另外一个更严重的问题是,当保存的是int8的类型时,使用mongo shell查询处理的结果可能是不准确的(因为float8不能精确的表述int8,虽然可以精确表述int4)。
如:1. 在mongoshell总查看存放了数值3的一个int8的类型
> doc = db.nums.findOne()
{
    "_id" : ObjectId("4c0beecfd096a2580fe6fa08"),
    "myInteger" : {
        "floatApprox" : 3
    }
}
返回的myInteger key被表述为浮点型,并且以内嵌文档的形式展示。(内嵌文档只有一行,表示该数值是精确表述的(如这里的"floatApprox" : 3和真实存放在数据库中的值一样),如果是多行的话就不精确了,下面还有例子指出)
2. 表述一个数值 9223372036854775807 int8类型:
> db.nums.findOne()
{
    "_id" : ObjectId("4c0beecfd096a2580fe6fa09"),
    "myInteger" : {
        "floatApprox" : 9223372036854776000,
        "top" : 2147483647,
        "bottom" : 4294967295
    }
}
内嵌文档变成三个KEY了,多出来的top和bottom key 分别表示高位4byte和低位4byte。很明显数值已经不准确了。
内嵌文档的值可以和其他数值类型一样操作如;
> doc.myInteger + 1
4
> doc.myInteger.floatApprox
3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值