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提供了从集合中读取文档的以下方法: