MongoDB笔记0x01

2.5 MongoDB shell

MongoDB的shell包含Google的V8引擎,可以执行JavaScript代码,支持JavaScript标准库。打开shell时将会自动连接到本地的MongoDB服务器,也可以指定连接到远端的MongoDB服务器。此外,MongoDB的shell也提供一些方便的语法糖,供习惯于SQL shell的用户使用。

2.6 数据类型

MongoDB中包含JSON中的几种基本数据类型,还包括了一些其他的扩展类型,以下举出常用的数据类型:
(1)null:空值或值不存在;
(2)布尔值:true或false;
(3)数值:shell中默认使用64位的浮点数,如果想表示整数,可以使用整数类NumberInt(4字节有符号整数)或NumberLong(8字节有符号整数);
(4)字符串:utf-8的字符串;
(5)日期:Date类,使用new Date()创建;
(6)正则表达式:与JavaScript的正则表达式相同;
(7)内嵌文档:将一个文档作为另一个文档的值;
(8)对象id:ObjectId类,作为文档的唯一标识;
(9)数组:由一系列可以不同类型的数据构成。

关于日期:如果不使用new Date()创建日期对象而使用形如Date(...)的构造函数,返回的将是字符串而不是毫秒数。

关于内嵌文档:内嵌文档可以让数据存储更加自然、高效、立体。例如:


{
  "name": "Joe",
  "address": {
    "street": "123 Park Street",
    "city": "X town",
    "state": "NY"
  }
}

如果将这段数据存入关系型数据库中,一般来说会拆分成复数个表,会比较复杂。但是,MongoDB如此做的缺点是造成数据冗余。例如某城市的拼写有误,在关系型数据库中只需要修改城市表中有误的项,而对于MongoDB来说则是对属于该城市的每个人的信息进行修改。

关于_id:在MongoDB中,每个文档都必须有_id,其值可以是任意类型的任何值。在同一个集合的不同文档,其_id不能相同。

关于ObjectId:这是一种轻量型生成ID的类,可以在不同的机器上使用同种方法生成全局唯一的ID。由于传统数据库中使用的自增主键很难在分布式数据库中同步生成,所以MongoDB采用了这种方法。

ObjectId构成:ObjectId占用12字节的空间,其中0-3字节是秒级的时间戳,标明文档的创建时间;4-6字节是机器名的hash值,以保证不同机器产生的ObjectId不同;7-8字节是PID,以保证在同一机器上并发的进程产生的文档的ObjectId不同;9-11字节是一个自增的计数器,以保证同一进程在1秒内创建的文档的ObjectId不同,一个进程在一秒内最多可以拥有2563个不同的ObjectId

插入文档时如果没有_id,系统会自动生成ObjectId。虽然可以由MongoDB服务器来做这件事,但通常是由客户端的驱动程序来完成。这体现了MongoDB的哲学理念:能交给客户端驱动程序做的事就不要交给服务器来做。因为扩展应用层比扩展数据库层简单很多,将部分工作交给客户端来完成,也能够减少服务器的负担。

Author: SinLapis
Link: http://sinlapis.github.io/2017/10/21/MongoDB笔记0x01/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.