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
相关文章
|
11月前
|
分布式计算 Hadoop 程序员
ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path
ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path
|
Linux Shell Windows
Shell - line 2: $‘\r‘: command not found
拷贝脚本提交后报错 line 2: $'\r': command not found,但是这是别的同学可以运行后发给我的,随后开始排查。安装 dos2unix 需要使用 yum。安装 yum 需要使用 brew。
398 0
Shell - line 2: $‘\r‘: command not found
Python遇到的坑--ValueError: check_hostname requires server_hostname
原因:这个其实跟选用的python版本的关系不大,主要原因是因为每次使用 pip install 命令下载插件的时候,下载的都是最新的版本,比如下载requests插件,它会自动的将依赖的urllib3这个插件也安装,然后依赖的插件版本太高,就导致了这个报错的问题。
Python遇到的坑--ValueError: check_hostname requires server_hostname
check_user_createdate.sh
在前面这篇文章Linux如何找出用户的创建时间里面讨论了查看用户创建时间的方法,后面自己尝试弄了一个脚本来检查所有用户创建时间脚本,当然更合理的应该叫检查所有用户的密码修改时间比较准确(因为这种方法有条件限制),期间和夕照讨论了一下如何用shell脚本实现,获益良多。
629 0