Be careful when using Number type with mongo shell

简介:
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
相关文章
|
4月前
|
关系型数据库 MySQL 数据库
Mysql-错误处理: Found option without preceding group in config file
Mysql-错误处理: Found option without preceding group in config file
143 0
|
Oracle 关系型数据库 Linux
Oracle Linux: Shell Script to Calculate Values Recommended Linux HugePages / HugeTLB Configuration (Doc ID 401749.1)
Oracle Linux: Shell Script to Calculate Values Recommended Linux HugePages / HugeTLB Configuration (Doc ID 401749.1)
179 0
|
Linux Shell Windows
Shell - line 2: $‘\r‘: command not found
拷贝脚本提交后报错 line 2: $'\r': command not found,但是这是别的同学可以运行后发给我的,随后开始排查。安装 dos2unix 需要使用 yum。安装 yum 需要使用 brew。
392 0
Shell - line 2: $‘\r‘: command not found