mongoDB基础

MongoDB是时下流行的NoSql数据库,它的存储方式是文档式存储,并不是Key-Value形式。

Posted by 南方 on August 8, 2017

mongDB简介

MongoDB是一个提供高性能,高可用性和自动缩放的开源文档数据库。

1. 文档数据库

MongoDB中的一个记录是一个文档,它是一个由字段和值对组成的数据结构。 MongoDB文档类似于JSON对象。字段的值可能包括其他文档,数组和文档数组。

使用文档的好处:

  • 文档(即对象)对应于许多编程语言中的本机数据类型。
  • 嵌入式文档和数组减少了对昂贵连接的需求。
  • 动态模式支持流畅的多态。

2. 主要特点

  • 高性能 MongoDB提供高性能的数据持久性。尤其是: 1)支持嵌入式数据模型可减少数据库系统上的I / O活动。 2)索引支持更快的查询,并且可以包括来自嵌入式文档和数组的密钥。
  • 丰富的查询语言 MongoDB支持丰富的查询语言来支持读写操作(CRUD)以及: 1)数据汇总 2)文本搜索和地理空间查询。
  • 高可用性 MongoDB的复制工具,称为副本集,提供: 1)自动故障转移和 2)数据冗余 3)复制集是一组MongoDB服务器,它们保持相同的数据集,提供冗余和增加数据可用性。
  • 水平可扩展性 MongoDB提供了可扩展性,作为其核心功能的一部分: 1)分片通过一组机器分发数据。 2)MongoDB 3.4支持基于分片键创建数据区域。在平衡的集群中,MongoDB将区域覆盖的读写操作只引导到区域内的分片。
  • 支持多存储引擎 MongoDB支持多种存储引擎,如: 1)WiredTiger存储引擎 2)MMAPv1存储引擎 此外,MongoDB还提供可插拔存储引擎API,允许第三方为MongoDB开发存储引擎。

mongDB概念

1. 数据库和集合

MongoDB在收藏中存储BSON文档,即数据记录;数据库中的集合。

数据库

在MongoDB中,数据库包含文档集合。 要选择要使用的数据库,在mongo shell命令为:use myDB 1)创建数据库 use myNewDB db.myNewCollection1.insertOne( { x: 1 } )

如果insertOne()操作不存在,则会创建数据库myNewDB和集合myNewCollection1。

有关数据库名称的限制列表,详见Naming Restrictions.

集合

MongoDB将文档存储在集合中。集合类似于关系数据库中的表。 如果一个集合不存在,MongoDB将在首次存储该集合的数据时创建该集合。 命令如下: db.myNewCollection2.insertOne( { x: 1 } ) db.myNewCollection3.createIndex( { y: 1 } ) 如果insertOne()和createIndex()操作不存在,则创建它们各自的集合。

视图

( 从3.4版开始,MongoDB增加了从现有集合或其他视图创建只读视图的支持。) 1)创建视图 2)行为 3)删除视图 4)修改视图 5)支持操作

加盖收藏

2. 文档

MongoDB将数据记录存储为BSON文档。 BSON是JSON文档的二进制表示形式,尽管它包含比JSON更多的数据类型。

文档类型

{
   field1: value1,
   field2: value2,
   field3: value3,
   ...
   fieldN: valueN
}
var mydoc = {
   _id: ObjectId("5099803df3f4948bd2f98391"),
   name: { first: "Alan", last: "Turing" },
   birth: new Date('Jun 23, 1912'),
   death: new Date('Jun 07, 1954'),
   contribs: [ "Turing machine", "Turing test", "Turingery" ],
   views : NumberLong(1250000)
}

以上的字段具有以下数据类型:

  • _id包含一个ObjectId。
  • name包含包含首个和最后一个字段的嵌入式文档。
  • 出生和死亡持有“日期”类型的值。
  • contribs包含一串字符串。
  • 视图持有NumberLong类型的值。

1)字段名称 都是字符类型,文档对字段名称有限制 2)字段值限制 对于索引集合,索引字段的值具有最大索引键长度限制。

点符号

MongoDB使用点符号来访问数组的元素并访问嵌入文档的字段。

1)数组 要通过基于零的索引位置指定或访问数组的元素,请将数组名称与点(。)和基于零的索引位置相连,并用引号括起来:”."

2)嵌入式文档

要使用点表示法指定或访问嵌入式文档的字段,请将嵌入的文档名称与点(。)和字段名称并入,并用引号括起来:”."

文档限制

1)文档大小限制 最大BSON文档大小为16兆字节。

最大文档大小有助于确保单个文档不能使用过多的RAM,或在传输过程中,带宽过大。为了存储大于最大大小的文档,MongoDB提供了GridFS API。

2)文档字段顺序 MongoDB在写入操作后保留文档字段的顺序,但以下情况除外:

_id字段始终是文档中的第一个字段。 包括重命名字段名称的更新可能导致文档中字段的重新排序。 版本2.6更改:从版本2.6开始,MongoDB积极地尝试保留文档中的字段顺序。 2.6版之前,MongoDB没有主动保留文档中字段的顺序。

3)_id字段 在MongoDB中,存储在集合中的每个文档都需要一个用作主键的唯一的_id字段。如果插入的文档省略_id字段,MongoDB驱动程序将自动为_id字段生成一个ObjectId。

_id字段具有以下行为和约束:

默认情况下,MongoDB在创建集合时在_id字段上创建唯一的索引。 _id字段始终是文档中的第一个字段。如果服务器首先接收到没有_id字段的文档,那么服务器将把该字段移动到开头。 _id字段可能包含除阵列之外的任何BSON数据类型的值。

文档结构其他用法

除了定义数据记录外,MongoDB还使用了整个文档结构,包括但不限于:查询过滤器,更新规范文档和索引规范文档。

3. BSON类型

BSON是用于在MongoDB中存储文档和进行远程过程调用的二进制序列化格式。 BSON规范位于bsonspec.org。

BSON支持以下数据类型作为文档中的值。每个数据类型都有相应的数字和字符串别名,可以与$ type运算符一起使用BSON类型查询文档。

Type Number Alias Notes
Double 1 “double”  
String 2 “string”  
Object 3 “object”  
Array 4 “array”  
Binary data 5 “binData”  
Undefined 6 “undefined” Deprecated.
ObjectId 7 “objectId”  
Boolean 8 “bool”  
Date 9 “date”  
Null 10 “null”  
Regular Expression 11 “regex”  
DBPointer 12 “dbPointer” Deprecated.
JavaScript 13 “javascript”  
Symbol 14 “symbol” Deprecated.
JavaScript (with scope) 15 “javascriptWithScope”  
32-bit integer 16 “int”  
Timestamp 17 “timestamp”  
64-bit integer 18 “long”  
Decimal128 19 “decimal” New in version 3.4.
Min key -1 “minKey”  
Max key 127 “maxKey”  

以下部分介绍特定BSON类型的特殊注意事项。

ObjectId

ObjectIds很小,可能是唯一的,快速生成和订购。 ObjectId值由12个字节组成,其中前四个字节是反映ObjectId创建的时间戳,具体为:

  • 表示自Unix纪元以来的秒数的4字节值,
  • 一个3字节的机器标识符,
  • 一个2字节的进程ID,和
  • 一个3字节的计数器,以随机值开头。

在MongoDB中,存储在集合中的每个文档都需要一个用作主键的唯一的_id字段。如果插入的文档省略_id字段,MongoDB驱动程序将自动为_id字段生成一个ObjectId。

MongoDB客户端应添加具有唯一ObjectId的_id字段。为_id字段使用ObjectIds提供了以下附加优点:

在mongo shell中,您可以使用ObjectId.getTimestamp()方法访问ObjectId的创建时间。 存储ObjectId值的_id字段上的排序大致相当于按创建时间排序。

** ObjectId值与生成时间的顺序之间的关系在一秒钟内就不严格。如果单个系统上的多个系统或多个进程或线程会在一秒钟内生成值; ObjectId值不表示严格的插入顺序。客户端之间的时钟偏移也可能导致非严格的排序,即使是值,因为客户端驱动程序生成ObjectId值。**

String

BSON字符串是UTF-8。一般来说,每个编程语言的驱动程序在将序列化和反序列化BSON时都从语言的字符串格式转换为UTF-8。这使得可以轻松地将大多数国际字符存储在BSON字符串中。 [1]此外,MongoDB $ regex查询支持正则表达式字符串中的UTF-8。

Timestamps

BSON具有内部MongoDB使用的特殊时间戳类型,并且不与常规Date类型相关联。时间戳值是64位值,其中:

前32位是一个time_t值(从Unix纪元开始的秒数) 第二个32位是在给定秒内的操作的递增序数。 在单个mongod实例中,时间戳值始终是唯一的。

在复制中,oplog具有ts字段。此字段中的值反映了使用BSON时间戳值的操作时间。

如果在顶级字段中插入包含空BSON时间戳的文档,则MongoDB服务器将使用当前时间戳值替换该空时间戳。例如,如果您创建一个插入时间戳值的文档,如下面的操作: var a = new Timestamp();

db.test.insertOne( { ts: a } );

然后,db.test.find()操作将返回类似于以下内容的文档: { “_id” : ObjectId(“542c2b97bac0595474108b48”), “ts” : Timestamp(1412180887, 1) }

如果ts是嵌入式文档中的字段,则服务器将其留作空时间戳值。

在版本2.6中更改:以前,服务器将仅替换插入文档的前两个字段(包括_id)中的空时间戳值。现在MongoDB将取代任何顶级字段。

Date

BSON Date是一个64位整数,表示自Unix纪元以来的毫秒数(1970年1月1日)。这导致了过去和未来的可观日期范围约2.9亿年。

官方BSON规范将BSON日期类型称为UTC datetime。

BSON日期类型已签名。 [2]负值代表1970年以前的日期。 使用mongo shell中的新Date()构造函数构造一个Date: var mydate1 = new Date()

4. 比较/排序顺序

5. MongoDB扩展JSON

mongoDB安装与启动

brew install mongodb 下图说明已经安装成功,安装的目录就是 /usr/local/Cellar/mongodb/3.4.6

mongod命令尝试启动报错 解决方案:指定MongoDb数据存储文件夹 默认mongodb 数据文件是放到根目录 data/db 文件夹下,启动时没有这个文件,需自行创建 创建命令为:$ sudo mkdir -p /data/db

继续尝试启动还是报错

原因是创建的data db目录并不在home目录下面所以需要确保文件夹权限 查看当前用户:users/id -ua/who/whoami 这四个命令都可 给刚刚创建的文件夹赋予当前用户的权限:sudo chown -R $USER /data/db

MongoDB CRUD操作

CRUD操作创建,读取,更新和删除文档。

1. 写

创建或插入操作将新的文档添加到集合。如果集合当前不存在,则插入操作将创建集合。

2. 读

读取操作从集合中检索文档;即查询文档的集合。 MongoDB提供了从集合中读取文档的以下方法:

3. 更新

4. 删除

5. 批量写