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
目录
相关文章
|
6月前
|
JavaScript 前端开发 开发工具
TypeScript的介绍,let age:number = xxx,可以直接看出数据类型,Type由微软开发,可以在任何浏览器和系统中运行,比较适合大型项目,TypeScript的安装
TypeScript的介绍,let age:number = xxx,可以直接看出数据类型,Type由微软开发,可以在任何浏览器和系统中运行,比较适合大型项目,TypeScript的安装
|
前端开发
input去掉输入框type为number时的上下箭头的实现方法
input去掉输入框type为number时的上下箭头的实现方法
111 0
|
监控 Shell
Shell脚本监控mongo并自动重启
Shell脚本监控mongo并自动重启
171 0
Mongo Shell 常用查询命令
一、find 命令进行简查询 find( 查询条件 ,返回的字段), 1. 查询时返回所有字段 db.user.find() --> 查询user集合中所有的数据
|
移动开发 前端开发
火狐谷歌浏览器去掉input type=number时控件的方法
火狐谷歌浏览器去掉input type=number时控件的方法
|
Shell 数据库 Android开发
避免mongo shell的查询扫表问题
主要是解决防止人为误操作导致mongo shell查询的时候发生扫描表的事件,导致雪崩问题
1310 0
|
JavaScript Android开发 前端开发
解决input[type=number]无法显示非数字字符的问题
在移动端webview实现的页面中,有数字的地方必须使用input type="number"类型的input,否则触发后的键盘为全键盘,而非数字键盘。但另外的一个问题是,input 为 type="number" 类型的无法显示非数字字符,比如:12/23中/。
1365 0