MongoDB中每条记录称作一个文档,这个文档和我们平时用的JSON有点像,但也不完全一样。JSON是一种轻量级的数据交换格式。简洁和清晰的层次结构使得JSON成为理想的数据交换语言。JSON易于阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。但是JSON也有局限性,比如它只有null、布尔、数字、字符串、数组和对象这几种数据类型,没有日期类型,只有一种数字类型,无法区分浮点数和整数,也没法表示正则表达式或者函数。由于这些局限性,BSON闪亮登场啦。BSON是一种类JSON的二进制形式的存储格式,它和JSON一样,支持内嵌的文档对象和数组对象。但是BSON包含JSON没有的一些数据类型,如Date和BinDate类型。MongoDB使用BSON作为文档数据存储和网络传输格式。本文就来说说MongoDB中都支持哪些数据类型,其实也就是来看看BSON有哪些好玩的地方。
数字
shell默认使用64位浮点型数值,如下:
对于整型值,我们可以使用NumberInt或者NumberLong表示,如下:
字符串
字符串可以直接存储,如下:
正则表达式
正则表达式主要用在查询里边,查询时我们可以使用正则表达式,语法和JS中正则表达式的语法相同,比如查询所有key为x,value以hello开始且不区分大小写的文档,如下:
数组
数组也是被支持的,如下:
数组中的数据类型可以是多种多样的。
日期
MongoDB支持Date类型的数据,可以直接new一个Date对象,如下:
内嵌文档
一个文档也可以作为另一个文档的value,这个其实很好理解,如下:
书有一个属性是作者,作者又有name、age等属性。
ObjectId
前面提到过,我们每次插入一条数据,系统都会自动帮我们插入一个_id键。这个键的值不可以重复,它可以是任何类型的,我们也可以手动插入。默认情况下它的数据类型是ObjectId,由于MongoDB在设计之初就是用作分布式数据库,所以使用ObjectId可以避免不同数据库中_id的重复(如果使用自增的方式,在分布式系统中就会出现重复的_id值)。
ObjectId使用12字节的存储空间,每个字节可以存储两个十六进制数字,所以一共可以存储24个十六进制数字组成的字符串。在这个字符串中,前8位表示时间戳,接下来6位是一个机器码,接下来4位表示进程id,最后6位表示计数器。
二进制
MongoDB中也可以存储二进制数据,不过这种情况并不多,二进制数据的存储不能在shell中操作。
代码
文档中也可以包含JS代码,如下: