mongodb11天之屠龙宝刀(九)js函数入门:MongoDB基于js的数据类型修改
mongodb11天之屠龙宝刀(九)js函数入门:MongoDB基于js的数据类型修改 Mongodb并不提供Alter table这样的语句或者工具修改字段类型,只能写程序转。
数据类型
基本数据类型
MongoDB的文件存储格式为BSON,同JSON一样支持往其它文档对象和数组中再插入文档对象和数组,同时扩展了JSON的数据类型.与数据库打交道的那些应用。例如,JSON没有日期类型,这会使得处理本来简单的日期问题变得非常繁琐。只有一种数字类型,没法区分浮点数和整数,更不能区分32位和64位数字。也没有办法表示其他常用类型,如正则表达式或函数。
下面是MongoDB的支持的数据类型:
null null用于表示空值或者不存在的字段。 {"x":null}
布尔 布尔类型有两个值'true'和'false1'. {"X":true}
32位整数 类型不可用。JavaScript仅支持64位浮点数,所以32位整数会被自动转换。
64位整数 不支持这个类型。shell会使用一个特殊的内嵌文档来显示64位整数,
64位浮点数 shell中的数字都是这种类型。下面的表示都是浮点数: {"X" : 3.1415926} {"X" : 3}
字符串 UTF-8字符串都可表示为字符串类型的数据: {"x" : "foobar"}
符号 不支持这种类型。shell将数据库里的符号类型转换成字符串。
对象id 对象id是文档的12字节的唯一 ID, {"X" :ObjectId() }
日期 日期类型存储的是从标准纪元开始的毫秒数。不存储时区: {"X" : new Date()}
正则表达式 文档中可以包含正则表达式,采用JavaScript的正则表达式语法: {"x" : /foobar/i}
代码 文档中还可以包含JavaScript代码:{"x" : function() { /* …… */ }}
二进制数据 二进制数据可以由任意字节的串组成。不过shell中无法使用。
最大值 BSON包括一个特殊类型,表示可能的最大值。shell中没有这个类型。
最小值 BSON包括一个特殊类型,表示可能的最小值。shell中没有这个类型。
未定义 文档中也可以使用未定义类型:{"x":undefined}
数组 值的集合或者列表可以表示成数组:{"x" : ["a", "b", "c"]}
内嵌文档 文档可以包含别的文档,也可以作为值嵌入到父文档中,数据可以组织得更自然些,不用非得存成扁平结构的:{"x" : {"food" : "noodle"}}
数字
JavaScript中只有一种“数字”类型。因为MongoDB中有3种数字类型(32位整数、64位整数和64位浮点数),shell必须绕过JavaScript的限制。默认情况下,shell中的数字都被MongoDB当做是双精度数。这意味着如果你从数据库中获得的是一个32位整数,修改文档后,将文档存回数据库的时候,这个整数也被转换成了浮点数,即便保持这个整数原封不动也会这样的。所以明智的做法是尽量不要在shell下覆盖整个文档。
日期
JavaScript的Date对象用做MongoDB的日期类型,创建一个新的Date对象时,通常会调用new Data(“”)。
1、案例:将string转换成int
原始数据
mongo执行以下代码。需要支持JS.部分IDE需要专业版
db.gaode_pois_hotel_yunnan_extra_mid07.find({}).forEach(
function(i){
i.citycode=new NumberInt(i.citycode);
db.gaode_pois_hotel_yunnan_extra_mid07.save(i);
}
);
结果:
如果转换其他类型的话对应修改NumberInt,比如说转换成string则修改i.citycode=new String(i.citycode);
,或者对于修改citycode*10并转换类型则变为i.citycode=new String(i.citycode*10);
注意:String中S大写
当类型较多时,选择某一个类型转换则执行
如下命令是将hscourses表中的ClassID字段从整型转换到字符串型:
db.hscourses.find({'ClassID' : { $type : 16 }}).forEach(function(x) {x.ClassID = String(x.ClassID);db.hscourses.save(x); })
字段类型编号:
1 Double 浮点型
2 String UTF-8字符串都可表示为字符串类型的数据
3 Object 对象,嵌套另外的文档
4 Array 值的集合或者列表可以表示成数组
5 Binary data 二进制
7 Object id 对象id是文档的12字节的唯一 ID 系统默认会自动生成
8 Boolean 布尔类型有两个值TRUE和FALSE
9 Date 日期类型存储的是从标准纪元开始的毫秒数。不存储时区
10 Null 用于表示空值或者不存在的字段
11 Regular expression 采用js 的正则表达式语法
13 JavaScript code 可以存放Javasript 代码
14 Symbol 符号
15 JavaScript code with scope
16 32-bit integer 32位整数类型
17 Timestamp 特殊语义的时间戳数据类型
18 64-bit integer 64位整数类型
3、统计某一个字段的个数
db.gaode_pois_hotel_yunnan_extra_mid07.find({citycode:{$type:16}}).count()
4、调用函数进行类型 关于转换从string转化data,int32,都没问题,但是执行转换双精度的过程中始终在shell中无法执行,如果你可以烦请告知,我这面因此考虑使用函数转换, 函数形式如下:函数调用方式参考连接
function types_convert() {
db.gaode_pois_hotel_yunnan_extra_mid07.find().forEach(function(item){
item.old_cost=item.cost;
item.parseInt_cost=parseInt(item.cost);
item.parseFloat_cost=parseFloat(item.cost);
item.NumberInt_cost=NumberInt(item.cost);
item.String_cost=String(item.cost);
db.gaode_pois_hotel_yunnan_extra_mid07.save(item);
}
)
}
两种常见格式转换 1、string
2、double
因此,如果要int就用NumberInt(),转成double用parseFloat() ,string用String,注意大小写!
js parsefloat parseint
JavaScript提供了3个显式的类型转换函数,分别是eval()、parseInt()和parseFloat()。
eval()函数:将字符串表达式转换成数字值。例如,语句total=eval("432.1*10")的结果是total=4321即将数值4321赋予total变量。
parseInt()函数:把字符串转换成整数。返回是从字符串的第一个字符开始,如果字符不是以整数开头则返回0。parseInt()函数还可以转换十六进制数或十进制数。
例如:parseInt("123xyz") 返回123,而parseInt("xyz")返回0。
parseFloat()函数:类似于parseInt()函数,它返回字符串上包含的第一个浮点数。如果字符串不以有效浮点数开头,则返回0。
例如:parseFloat("2.1e4xyz")返回21000;而parseFloat("xyz")返回0。
JavaScript中parseFloat函数方法是返回由字符串转换得到的浮点数。 使用方法:
parseFloat(numString)其中numString 参数是包含浮点数的字符串。JavaScript中parseFloat函数方法返回与 numString 中保存的数相等的数字表示。如果 numString 的前缀不能解释为浮点数,则返回 NaN (而不是数字)。
parseFloat("abc") // 返回 NaN。
parseFloat("1.2abc") // 返回 1.2。
- MySQL InnoDB Cluster环境搭建和简单测试
- 多平台下的数据存储新秀-PROTOBUF
- TCP的长连接与短连接的含义与区别(附Java代码实现)
- Mycat读写分离配置实践
- 快速搭建主从的脚本和问题排查
- MySQL在RR隔离级别下的unique失效和死锁模拟
- Golang语言--glog日志库使用
- 一个MySQL死锁问题的复现
- Spring Boot 2.0 新特性(一):配置绑定 2.0 全解析
- MySQL断电恢复的一点简单分析
- Spring Boot 2.0 新特性(二):新增事件ApplicationStartedEvent
- 奇怪的go语言iota
- Golang web服务器处理前端HTTP请求跨域的方法
- MySQL死锁的两个小案例
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- stm32中阻塞模式和非阻塞模式 in blocking mode 与 in non-blocking mode区别
- 机器学习(四)—决策树
- 机器学习(五)—朴素贝叶斯
- C语言面试题——位域及大小端模式的理解
- stm32添加串口调试
- STM32单片机极简方法 使用宏定义 代替复杂的重定向printf()函数,实现串口打印。(HAL库例程)
- 机器学习(六)— logistic回归
- 如果简化stm32中printf函数的使用——首先重定向
- TF-IDF算法(2)—python实现
- C语言定义数组时使用枚举作为数组的下标
- 机器学习(七)—回归
- C语言定义数组时使用枚举作为数组的下标 ——c99功能
- C语言——for循环和while循环的效率区别——类似哨兵思想
- 机器学习(八)—Apriori算法
- 机器学习(九)—FP-growth算法