MongoDB是一种开源文档型数据库,它具有高性能,高可用性,自动扩展性
1.文档数据库
MongoDB用一个文档来表示一条记录,文档的数据结构由键值对组成。MongoDB文档类似于JSON对象,字段值可能是文档,数组,或文档数组。
使用文档的优点:
- 文档中字段值的数据类型同大多数编程语言中的原生数据类型一致。
- 嵌入式文档和数组减少了连接查询的需求。
- 动态的文档结构支持多态性。
2.主要特性
高性能
MongoDB支持高性能数据存储。特别地:
- 支持嵌入式数据模型以减少对数据库系统的I/O
- 利用索引实现快速查询,并且嵌入式文档和集合也支持索引
丰富的查询语言
MongoDB提供了丰富的查询语言以支持读写操作和聚集操作、文本检索、地理信息查询
高可用性
MongoDB的复制能力被称作复制集(replica set),它提供了自动的故障迁移和数据冗余。一个复制集是一组包含了相同数据的多台MongoDB服务器,它提供了冗余性和加强了数据的可用性。
横向扩展
MongoDB的横向扩展能力是其核心功能的一部分:
- 分片的数据分布在服务器集群上。
- 带标签的分片能够引导数据到指定的分片上。
支持多存储引擎
包括:WiredTiger Storage Engine,MMAPv1 Storage Engine。此外,MongoDB 提供可插拔存储引擎API,允许第三方开发者为MongoDB开发存储引擎。
3.数据库和集合
MongoDB 存储BSON文档,例如数据记录在集合中,集合在数据库中。
3.1数据库
在MongoDB 中数据库持有集合。
在Mongo shell中,选中一个数据库使用如下命令:use ,例如:
use myDB
创建数据库
如果待操作的数据库不存在,那么在第一次向MongoDB 存储数据时,MongoDB会创建这个数据库。例如,使用如下命令操作一个不存在的数据库。
use myNewDB
db.myNewCollection1.insert( { x: 1 } )
insert()操作创建了数据库myNewDB,若集合myNewCollection1也不存在,同样地集合myNewCollection1也被创建。
3.2集合
MongoDB 在集合中存储文档,集合类似于关系数据库中的表。
创建一个集合
如果一个集合不存在,使用下面命令时集合会被创建:
db.myNewCollection2.insert( { x: 1 } )
db.myNewCollection3.createIndex( { y: 1 } )
insert() 和 createIndex()在集合不存在的情况下会创建集合。
显式创建集合
MongoDB 提供了db.createCollection()方法来显示地创建一个集合。可以为创建的集合指定参数,例如设置集合的大小或者文档的验证规则,如果不需要指定这些参数,那么没必要显示地创建一个集合。
文档验证(3.2版新特性)
默认情况下,一个集合中的文档不必具有相同的结构 ,
一个集中的文档不需要具有一系列相同的字段,并且不同文档中字段的数据类型可以不同。
修改文档结构
可以更改集合中的文档结构,如添加新字段,删除现有字段,或将字段值更改为一种新的类型,更新文档结构
3.3固定集合
3.3.1概述
固定集合,即具有固定大小的集合,它支持基于插入顺序的插入和查询这两种高通量操作。固定大小的集合的工作方式类似于循环缓存:一旦一个集合被填满,待插入的文档会覆盖掉最先插入的文档。
3.3.2行为
插入顺序
固定集合保证了插入顺序,因此对于查询操作而言,不需要索引的支持就可以返回多个按顺序排列的文档。没有索引的开销,固定集合支持更高的插入吞吐量。
自动删除最先插入的文档
为了给新文档让出存储空间,固定集合自动删除最先插入的文档而不需要显示的删除操作。
例如,集合oplog.rs中存储了副本集操作日志,这里副本集使用了固定集合。考虑下面对固定集合可能的操作:
- 存储由大容量系统生成的日志信息。在无索引的情况下,文档插入固定集合的速度与将日志信息写入文件系统的速度相似。此外,先进先出的特性保证了事件的顺序,同时管理了存储的使用。
- 在固定集合中缓存少量数据。由于缓存重读而非写,你应确保这个集合总在工作集中(例如,内存中)或接受一点点写操作,因为索引需要写操作。
_id 字段索引
固定集合含有_id字段,此字段索引是默认的。
3.3.3限制和建议
更新
如果你要更新固定集合中的文档,创建索引以防止全表扫描。
文档大小(3.2版本变更)
如果更新或替换操作改变了文档大小,则操作失败。
删除文档
不能删除固定集合中的文档,可使用drop() 命令删除整个固定集合并新建之。
分片
固定集合不允许分片。
查询效率
使用自然排序可高效地检索最新插入的元素。这是(有点)像追踪一个日志文件。
聚集操作符$out
不能使用聚集管道操作符$out将结果写入固定集合
3.3.4过程
创建固定集合
在mongo shel中,使用db.createCollection()方法创建固定集合,创建固定集合的时候要指定集合的字节大小,MongoDB将会提前为所创建的固定集合分配存储空间。固定集合的字节大小包含了内部使用的空间大小。
db.createCollection( "log