简介
最像关系型数据库的nosql数据库。
高读写性能,高可用副本集,可拓展分片集群技术-->高可拓展性,高可伸缩性-->大数据
文档是处理信息的基本单位。
数据采用JSON/BSON格式存储,方便存储树形结构数据,支持多种索引结构。
概述
MongoDB
-
高性能
内存计算
-
高可用
本地复制、自动故障转移
-
可拓展
单服务器->多中心数据架构
文档型数据库的特点和优势
- 高性能(多种存储引擎)
- 高可用副本集
- 可拓展分片集群技术:支持大数据分布式存储
- 支持事务:文档级事务管理
- 灵活文档模型
文档数据库存储架构(难点)
JSON/BSON
JSON
轻量级数据交换格式,简单易于读写。数据内容是可嵌套的kv文本形式。
{
"bookname":"数据库系统",
"publisher":true,
"price":42.0
}
值的类型:
基本类型:字符串,数值,布尔,空值null
复杂类型:数组,Object
Object使用{}包含一系列无序的kv键值对,kv用冒号分隔。
可以使用obj.key访问对应value。
BSON
二进制JSON,主要被用作MongoDB中数据存储和网络传输格式。
优点
- 数据访问性能
- 数据类型更丰富
- 有时占用更多的空间
MongoDB数据存储
数据库-->集合-->文档,相当于数据库-->表-->行。
!需要先将集合添加到数据库中,再将文档添加到集合中。
文档结构可嵌套,可表示为树形层次结构。
- 数据库(database)
用名称作为唯一标识:小写字母,长度不大于64位
四个默认数据库:
- admin 系统管理员级操作的数据库,存储用户、角色,执行特定服务器端命令
- local 副本集元数据,数据库不会被复制,所存储的任何集合只能在各自的服务器实例上
- config 分布式分片配置相关信息
- test 默认连接
- 集合(collection) 相当于没有固定格式(模式自由,结构可变)的表,是多个文档的组合。
模式自由:不受类似关系型数据库中关系范式思想的束缚。
结构可变:同一集合中可以有多种结构的文档。
使用名称唯一标识,可以是任意utf-8字符,不能以system.(系统预留)和$(保留字符)作为自定义集合名称前缀。
- 文档(document)
相当于RDB中的一行。每个文档是结构类似于JSON的BSON对象。
每一个文档有一个特殊的key,即_id作为文档中唯一标识(主键),会默认添加,其值唯一不可变。文档中各个key关联着value。其他字段命名不可以以$开头,不可包含点号,不可以是null字符串。
一个文档包含很多域Field,域对应RDB中列/字段。文档中值的类型除了数值、字符串等基本类型,也可以是文档,从而形成树形嵌套结构的复杂文档。
通过文档数组类型,可以实现一对多数据关系的存储。
表示文档之间关系:
-
嵌套Embed
-
引用链接Link
MongoDB文档唯一性机制
集合在主键设计上没有采用自动增长主键,因为分布式服务器之间做数据同步很麻烦。
mongoDB采用了ObjectId的方式,生成方便,占用空间比long类型数据多了4个字节(12字节,各个字节数据用16进制表示)来存储文档唯一标识。
每个文档标识包含标识产生时间、机器标识、进程、自增序列,组合起来保证唯一性。
ObjectId("timestamp machine_id process_id counter") //就是_id
文档数据库管理基础(重点)
数据库操作
数据库往往与应用相对应,不同应用数据存储在不同数据库中,一个MongoDB服务器可以建立多个数据库。
MongoDB没有创建数据库的命令。
如果想创建一个叫myTest的数据库,先运行use myTest,再做一些操作,如db.createCollection('user')向数据库中添加一个集合,这样就可以创建一个myTest数据库了。
如果仅仅执行use操作,虽然使用db命令可以看到当前数据库,但是并未真正建立,通过show dbs命令看不到它。
集合操作
集合创建很灵活,不一定必须先创建集合再插入数据,可以直接插入数据,如果集合不存在会自动先创建集合,再插入文档数据。
文档操作
最大的BSON格式文档为16MB,设置文档大小限制是为了保证单文档不会过多占用内存,或者在传输过程中不会占用较大的带宽。