MongoDB数据类型

上篇文章我们介绍了MongoDB的最基本的增删改查操作,也介绍了一些基础的概念,MongoDB中每条记录称作一个文档,这个文档和我们平时用的JSON有点像,但也不完全一样。JSON是一种轻量级的数据交换格式。简洁和清晰的层次结构使得JSON成为理想的数据交换语言,JSON易于阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率,但是JSON也有它的局限性,比如它只有null、布尔、数字、字符串、数组和对象这几种数据类型,没有日期类型,只有一种数字类型,无法区分浮点数和整数,也没法表示正则表达式或者函数。由于这些局限性,BSON闪亮登场啦,BSON是一种类JSON的二进制形式的存储格式,简称Binary JSON,它和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和BinData类型,MongoDB使用BSON做为文档数据存储和网络传输格式。本文我们就来说说MongoDB中都支持哪些数据类型,其实也是来看看BSON有哪些好玩的地方。

本文是MongoDB系列的第三篇文章,了解前面的文章有助于更好的理解本文:


数字

shell默认使用64位浮点型数值,如下:

db.sang_collec.insert({x:3.1415926})
db.sang_collec.insert({x:3})

对于整型值,我们可以使用NumberInt或者NumberLong表示,如下:

db.sang_collec.insert({x:NumberInt(10)})
db.sang_collec.insert({x:NumberLong(12)})

字符串

字符串也可以直接存储,如下:

db.sang_collec.insert({x:"hello MongoDB!"})

正则表达式

正则表达式主要用在查询里边,查询时我们可以使用正则表达式,语法和JavaScript中正则表达式的语法相同,比如查询所有key为x,value以hello开始的文档且不区分大小写:

db.sang_collec.find({x:/^(hello)(.[a-zA-Z0-9])+/i})

数组

数组一样也是被支持的,如下:

db.sang_collec.insert({x:[1,2,3,4,new Date()]})

数组中的数据类型可以是多种多样的。

日期

MongoDB支持Date类型的数据,可以直接new一个Date对象,如下:

db.sang_collec.insert({x:new Date()})

内嵌文档

一个文档也可以作为另一个文档的value,这个其实很好理解,如下:

db.sang_collect.insert({name:"三国演义",author:{name:"罗贯中",age:99}});

书有一个属性是作者,作者又有name,年龄等属性。

ObjectId

我们在前面提到过,我们每次插入一条数据系统都会自动帮我们插入一个_id键,这个键的值不可以重复,它可以是任何类型的,我们也可以手动的插入,默认情况下它的数据类型是ObjectId,由于MongoDB在设计之初就是用作分布式数据库,所以使用ObjectId可以避免不同数据库中_id的重复(如果使用自增的方式在分布式系统中就会出现重复的_id的值),这个特点有点类似于Git中的版本号和Svn中版本号的区别。

ObjectId使用12字节的存储空间,每个字节可以存储两个十六进制数字,所以一共可以存储24个十六进制数字组成的字符串,在这24个字符串中,前8位表示时间戳,接下来6位是一个机器码,接下来4位表示进程id,最后6位表示计数器。

二进制

MongoDB中也可以存储二进制数据,不过这种情况并不多,二进制数据的存储不能在shell中操作,我们在后面的代码中会介绍这种存储方式。

代码

文档中也可以包括JavaScript代码,如下:

db.sang_collect.insert({x:function f1(a,b){return a+b;}});

好了,MongoDB的数据类型我们就先介绍这么多,这里只是做一个大致的了解,后文我们还会再详细的说到这些东西的详细使用方式。小伙伴们有问题欢迎留言讨论。

参考资料:

1.《MongoDB权威指南第2版》

原文发布于微信公众号 - 玩转JavaEE(gh_d1ca11234a30)

原文发表时间:2017-11-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Petrichor的专栏

python3 调用heapq库 时遭遇 "TypeError: unorderable types"

同样的代码在LeetCode上提交,在 python3解释器 下报错,换成 python2解释器 下却好好的:

1553
来自专栏C/C++基础

Linux命令(11)——col命令

col命令是一个标准输入文本过滤器,它从标准输入读取内容,输出到标准输出。在许多UNIX说明文件里,包含控制字符。当我们运用Shell特殊字符>和>>,把说明文...

1032
来自专栏Leetcode名企之路

jvm类加载机制

类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。

1343
来自专栏乐百川的学习频道

设计模式(二十三) 模板模式

模板模式也是一种行为型模式,而且它非常好理解。当我们解决问题需要固定几个步骤, 这些步骤的顺序不能改变,而步骤的具体实现可以变化的时候,就可以使用模板模式。模板...

1726
来自专栏JavaEdge

JVM内存模型1 程序计数器2. Java虚拟机栈(JVM Stack)3. 本地方法栈(Native Method Stack)4 Java堆(Java Heap)5 方法区6 直接内存(Direc

4679
来自专栏程序员互动联盟

【答疑解惑】java中switch语句陷阱

语音版: 今天群中小伙伴们遇到了一个switch问题我给大家讲解一下,算是Java中的小陷阱吧。 Java中的switch语句穿透: 今天一同学写了类似下面的代...

3697
来自专栏纯洁的微笑

jvm系列(一):java类的加载机制

1、什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Cl...

4016
来自专栏java系列博客

Java面试通关要点汇总集基础篇之参考答案

2324
来自专栏WindCoder

《Linux内核分析》之计算机是如何工作的 实验总结

马马虎虎学完了Python课程,一直想学下linux,看到里面有个linux的就选上了。当初没细看,如今听完第一节课有点傻眼,竟然糊里糊涂给自己找了一科汇编语言...

1271
来自专栏眯眯眼猫头鹰的小树杈

猫头鹰的深夜翻译:理解java的classloader

Java ClassLoader是java运行系统中一个至关重要但是经常被忽略的组件。它负责在运行时寻找并加载类文件。创建自定义的ClassLoader可以彻底...

1434

扫码关注云+社区

领取腾讯云代金券