MongoDB的文档使用BSON(Binary JSON)来组织数据,BSON类似于JSON,JSON只是一种简单的表示数据的方式,只包含了6种数据类型(null、布尔、数字、字符串、数组及对象),不能完全满足复杂业务的需要,因此,BSON还提供日期、32位数字、64位数字等类型。以下对mongoDB的类型进行简要说明:
 
1、 Null[类型编号:10]
null类型用于表示空值或不存在的字段,如:{“x”:null}
 
2、 布尔类型 Boolean[类型编号:8]
布尔类型有两上值,’true’和’false’ ,如:{“x”:true}
 
3、 32位整数 32-bit integer[类型编号:16]
在由于mongoDB的控制台使用JS引擎进行输入,而JS仅支持64位浮点数,所以32位整数将会被自动转义;
 
4、 64位整数 64-bit integer[类型编号:18]
64位整数与32位整数一样,在MongoDB控制台使用时,会转义成64位浮点数。除外,如果数据库本身存储的数据类型无论是32位整数还是64位整数,使用MongoDB控制台获取后,更改其文档记录(即使没有修改整数本身,只修改了文档的其他部分),并重新使用控制台写回数据库,则其数据类型也会变成了64位浮点数。
除外,使用控制台查看一个64位整数时,可能会不正确定,原因是有些64位的整数不能精确表示为64位浮点数,而控制台呈示都是64位浮点数。
 
5、 数值类型:Double[类型编号:1]

在Mongo shell中,默认使用64位浮点型数据。因此,会有以下两种数值形式:

{"x" : 2.32}
//或
{"x" : 2}

对于整数类型,可以使用NumberInt()(位有符号整型)或NumberLong()(8位有符号整型)方法进行转换。示例如下:

{"x" : NumberInt(2)}
{"x" : NumberLong(2)}
 
6、 字符串类型:String[类型编号:2]
MongoDB中字符串类型使用UTF-8编码的字符表示。如:{“x”:”Hello QuickCodes”}
 
7、 符号 Symbol [类型编号:14]
在MongoDB控制台中不支持这种类型,将自动转义成字符串;
 
8、 对象id Object id[类型编号:7]
对象id是文档中唯一的12位的ID ,
在MongoDB来存储文档时,必须有一个“_id”键,这个键可以是任何类型,如果在增加文档时,没有这个_id键,则系统会使用ObjectId对象自动生成一个,在分布式环境中,不同的机器都能用全局唯一的同种方法来生成值,如:{"_id": ObjectId("57110709d1db0802a433a03c")}
其生成规则为:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11
     时间戳     |     机器   |   PID |    计数器
前4位表示时间戳,时间戳以秒为单位,由于时间戳在前面,可以更好地反映出数据插入时的时间顺序,使的数据更容易查询,建议索引更加容易。
虽然系统会自动创建_id键,但在高并发的应用下建议使用客户端的驱动程序来创建,主要原因是,尽管ObjectId可以生成,但是系统在生成时,还是会产生开销,增加数据库的负担。
在高并发的分布式环境中,只使用以秒为单位的时间戳和机器不能区分其唯一性,故在其后面添加了PID,即MongoDB的进程标识符,前9个字符保证了同一秒钟不同机器不同进程产生的ObjectId是唯一,两位是一个自动递增的计数器,确保相同进程同一秒产生的ObjectId也不一样。

相关函数:ObjectId()、getTimestamp()、valueOf()

 
9 日期 Date [类型编号:9]
MongoDB中日期使用时间戳表示,单位为毫秒,不存储时区。 从标准纪元开始的毫秒数 { “date”:new Date()}
创建日期对象时应该使用new Date(),而非构造函数Date()。将构造函数作为函数时返回的日期格式是字符串,而非日期对象(与JavaScript工作机制有关)。
  • MongoDB中,日期类型是一个64位的整数,它代表的是距Unix epoch的毫秒数
  • MongoDB在存储时间时,先转化为UTC时间

北京时间(CST) = UTC + 8个小时

  • MongoDB Shell中可以使用new Date或ISODate来创建时间对象,在进行显示时,Shell会根据本地时间去设置显示日期对象
10 正则表达式 Regular Expression[类型编号:11]
文档中可以包含正则表达式,遵循 JavaScript 的语法。主要用于查询,使用正则表达式作为限定条件

例如:{name:/foo/  }    name字段含有foo的文档

{name:/foo/i }    name字段含有foo的文档,且不区分大小写

{name:/^foo/i }  name字段以foo开头,且不区分大小写

11 代码 JavaScript(Scope)[类型编号:15]
MongoDB的文档和代码中可以包括JavaScript代码。如:
{"x" : function(){ /*这里是一段JavaScript代码*/}}
 
12二进制数据 Binary data[类型编号:5]
可以保存由任意字节组成的字符串,例如:图片、视频等。任意字节的二进制串组成, shell 不支持 。二进制数据是一个二进制字节的字作串,要保存非UTF-8字符到数据库中,只能使用十进制数据。
 
13 最大值 Max Key [类型编号:127]
表示可能的最大值, shell 不支持
 
14 最小值 Min Key[类型编号:255]
表示可能的最小值, shell 不支持
 
15 未定义 undefined
{ “x”: undefined}
 
16 数组 Array[类型编号:4]
数据集可以用数组格式存储,与JavaSript中的数组表示相同。如:

{"x" : ["cloudev.top", "QuickCodes.Net"]}
数组中可以包含不同类型的数据元素,包括内嵌文档和数组等。所有MongoDB中键-值对支持的数据类型都可以用做数组的值。
  • 数组是使用方括号来表示的一组值,它既可以作为有序对象(列表、栈、队列),也能作为无序对象(如集合)来操作
  • 数组中可以包含不同数据类型的元素(字符串、浮点数、文档等)                 例如:[ 3.14,"hello",[1,2,3] ,{"key":"MongoDB"} ]
  • 针对数组MongoDB提供了许多特定的操作符,例如:$push,$pop,$pull,$slice,$addToSet等
  • MongoDB 可自动的为数组元素建立Multikey 索引
 
17内嵌文档
文档可以作为文档中某个 key 的value。在MongoDB文档总大小限制为16MB,建议使用子文档的形式组织数据,子文档查询效率要高于多键查询。

{

"_id": ObjectId("57110709d1db0802a433a03c"),

title:"Hello QuickCodes",

author:"Mac.Manon",

      comments:[

       {nickname:"Peter",comment:"Ok"},

       {nickname:"Tom",comment:"Dig"} ]

}

文档可以做为键的值,即:内嵌文档。MongoDB与关系型数据库相比,最大的优势就是内嵌文档。与关系型数据库的扁平化数据结构相比,使用内嵌文档可以数据的组织方式更加自然。

18.时间戳 Timestamp [类型编号:17]

时间戳类型有两部分组成:32 bit-Unix epoch 和 32 bit-自增序数(同一秒)

Timestmp 只供MongoDB 数据库服务内部使用,用于记录操作的详细时间;

Timestamp 类型和Date类型是没有关系的,对于我们来说使用更多的Date类型;

相关函数:Timestamp()

 
上述数据类型,均有一个类型编号,如字符串型的类型编号为2,下面的指令会在user表查找字段名称为name,且数据保存为字符串格式的数据:

db.user.find({name:{$type:2}})

MongoDB入门教程三[数据类型]的更多相关文章

  1. MongoDB入门教程一[文档与集合]

    MongoDB 是面向集合存储的文档型数据库,其涉及到的基本概念与关系型数据库相比有所不同.举个例子,在关系型数据库中,我们记录一个订单的信息,通常是这样设计表结构的: 设计一个订单基本信息表和一个订 ...

  2. MongoDB入门教程二[MongoDB Shell 简介与使用]

    MongoDB Shell 是MongoDB自带的JavaScript Shell,随MongoDB一同发布,它是MonoDB客户端工具,可以在Shell中使用命令与MongoDB实例交互,对数据库的 ...

  3. mongodb入门教程

    title: mongodb入门教程 date: 2016-04-06 14:47:18 tags: --- 为什么要认识呢,因为这玩意就一傻逼 借用一下百科的介绍 MongoDB 是一个介于关系数据 ...

  4. Elasticsearch入门教程(三):Elasticsearch索引&映射

    原文:Elasticsearch入门教程(三):Elasticsearch索引&映射 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文 ...

  5. 无废话ExtJs 入门教程三[窗体:Window组件]

    无废话ExtJs 入门教程三[窗体:Window组件] extjs技术交流,欢迎加群(201926085) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3 ...

  6. mongodb入门教程二

    title: mongodb入门教程二 date: 2016-04-07 10:33:02 tags: --- 上一篇文章说了mongodb最基本的东西,这边博文就在深入一点,说一下mongo的一些高 ...

  7. MongoDb 入门教程

    MongoDb 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 它是可扩展的高性能数据存储解决方案,经常被用于非关系型数据的存储,能存储海量的数据. 常 ...

  8. PySide——Python图形化界面入门教程(三)

    PySide——Python图形化界面入门教程(三) ——使用内建新号和槽 ——Using Built-In Signals and Slots 上一个教程中,我们学习了如何创建和建立交互widget ...

  9. RabbitMQ入门教程(三):Hello World

    原文:RabbitMQ入门教程(三):Hello World 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog. ...

随机推荐

  1. POJ No 3259 Wormholes Bellman-Ford 判断是否存在负图

    题目:http://poj.org/problem?id=3259 题意:主要就是构造图, 然后判断,是否存在负图,可以回到原点 /* 2 3 3 1 //N, M, W 1 2 2 1 3 4 2 ...

  2. React - 环境准备

    1. 下载 node.js,在 https://nodejs.org/en/download/ 选择合适的版本. 2. 检查 node.js 是否安装成功. hueyMB:~ zhisenzheng$ ...

  3. 【AtCoder】AGC022 F - Leftmost Ball 计数DP

    [题目]F - Leftmost Ball [题意]给定n种颜色的球各k个,每次以任意顺序排列所有球并将每种颜色最左端的球染成颜色0,求有多少种不同的颜色排列.n,k<=2000. [算法]计数 ...

  4. 13、Math类简介

    Math类概述 在java.lang包下,有个Math类,这个类包含用于执行基本数学运算的方法,如四舍五入,开方等等. package com.sutaoyu.usually_class; publi ...

  5. c# List 所有操作方法例子

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Ref ...

  6. C 语言问题

    1.  如何生成 "半全局变量", 就是那种只能被部分源文件中的部分函数访问变量? 答: 这在C语言中办不到. 如果不能或不方便在一个源文件中放下所有的函数, 那么有三种的解决方案 ...

  7. mysql安装管理 -> 编译&yum_02

    首先 mysql5.7是目前的主流稳定版本,下载地址可以参考官网下载  --- >  官网下载点我 笔记为markdown模式,博客园不太兼容,详细内容参考  ---  有道云笔记点我 mysq ...

  8. liblinear和libsvm区别

    来源于知乎: 1. LibLinear是线性核,LibSVM可以扩展到非线性核(当也能用线性核,但同样在线性核条件下会比LibLinear慢很多).2. 多分类:LibLinear是one vs al ...

  9. 虚拟机 SUSE Linux Enterprise Server 12 SP2 64

    下载地址:https://www.suse.com/zh-cn/products/server/download/ 下载以后使用虚拟机安装即可

  10. linux下快速安装emacs方法

    背景 在公司工作的时候经常需要在很多服务器之间切换,而公司的服务器上一般都没emacs,因此总结一下快速安装emacs的方法. 最简单的是直接使用yum安装,但是有两个问题,一个是有的生产服务器直接没 ...