1.简介
由c++编写,基于分布式文件存储的数据库系统,(来自于英文单词“Humongous”,中文含义为“庞大”)。
Mongodb将数据存储为一个文档,数据结构由键值(key=>value)对组成。
BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。
| SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
|---|---|---|
| database | database | 数据库 |
| table | collection | 数据库表/集合 |
| row | document | 数据记录行/文档 |
| column | field | 数据字段/域 |
| index | index | 索引 |
| table joins | 表连接,MongoDB不支持 | |
| primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
优势:
- 快。nosql基于内存设计,(主要原理:将热数据存在物理内存中,提高整体查询速度)。
- BJSON。格式简单,易读。
- 高拓展性。复制,分片。
- 持久化在硬盘。开启journal,刷盘间隔100ms,每次写入会记录一条操作日志。
2.概念
1.数据库
一个mongodb中可以建立多个数据库。默认库为"db",存储在data目录中。
保留数据库名,特殊作用数据库:
- admin:权限角度来看,这是个"root"数据库。将用户添加到该库中,这个用户自动继承所有数据库权限。
- local:这个数据永远不会被复制,可以用来存储限于本地服务器的任意集合。
- config:当Mongdb用于分片设置时,config数据库在内部使用,用于保存分片相关的信息。
2.文档
文档是一组健值(key-value)对(即BSON)。Mongdb文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型。
- 文档中的键值对是有序的。
- 文档中的值不仅可以是双引号中的字符串,还可以是其他数据类型。
- 区分类型和大小写。
- 文档中不能有重复的键。
规范:
- 不能含有\0(空字符串)。
- .和$只能在特定的环境下使用。
- 以下划线_开头的键是保留的。
3.集合
集合是Mongodb文档组。没有固定的结构,通常情况下我们插入集合的数据都会有一定的关联性。
当第一个文档插入时,集合就会被创建。就是说集合后要再插入一个文档,集合才真正创建。
capped collections:
- 固定大小的collection。
- 高性能自动的维护对象的插入顺序,适合类似记录日志的功能。
- 必须显示的创建一个capped collection,指定大小,单位是字节,提前分配存储空间。
- 按照文档插入顺序保存在集合中,而不是以索引确定插入数据,提高增添数据的效率。
4.元数据
数据库的信息是存储在集合中。他们使用了系统的命名空间:
dbname.system.*
5.Mongdb数据类型
常用:String,Integer,Boolean,Double,Array,Object ID,时间戳。
Object ID:类似唯一主键。Mongdb文档必须有一个_id健。可以为任何类型,默认是Object ID对象。时间戳可以从该字段中获取。由:时间戳、客户端ID、客户进程ID、三个字节的增量计数器组成。
3.命令
| 命令 | 说明 | 备注 |
|---|---|---|
| show dbs | 显示所有数据库列表 | |
| use [数据库名] | 如果不存在创建,存在则连接到指定数据库 | |
| db | 显示当前数据库对象和集合 | |
| db.dropDatabase() | 删除数据库 | 步骤: 切换数据库->执行删除命令 |
| db.createCollection(name,options) | 创建集合(name:集合名称,options:可选参数,指定内存大小及索引的选项) | |
| db.collection.drop() | 删除集合 | |
| .... | ||
| db.collection.createIndex(keys, options) | 创建索引(keys:索引字段、options:1升序、-1降序创建索引) |
4.复制(副本集)
复制是将数据同步在多个服务器的过程。
原理
复制至少需要两个节点。主节点:负责处理客户端请求,其余都是从节点,负责复制主节点的数据。搭配方式:一主一从、一主多从。
主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的副本执行该操作。
副本集特征:
-
N 个节点的集群
-
任何节点可作为主节点
-
所有写入操作都在主节点上
-
自动故障转移
-
自动恢复
5.分片
相当于另一种集群,可以满足Mongodb大量增长的需求。通过在多台服务器上分割数据,使数据库系统可以存储更多的数据。
上图中主要有如下所述三个主要组件:
- shard:用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组一个replicas set承担,防止主机单点故障。
- Config Server:mongdb实例,存储了整个 ClusterMetadata,其中包括 chunk信息。
- query Routers:前端路由,客户端由此接入。且让整个集群看上去像单一数据库,前端应用可以透明使用。
6.Mongdb Java(springBoot整合)
maven:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
配置文件:
#mongodb配置
spring.data.mongodb.uri=mongodb://ip地址:27017/库名
mongoTemplate:
常用方法:
mongoTemplate.insert(student) //新增
mongoTemplate.findAll(Student.class); //查询Student文档的全部数据
mongoTemplate.findById(<id>, Student.class); //查询Student文档id为id的数据
mongoTemplate.find(query, Student.class); //根据query内的查询条件查询
mongoTemplate.upsert(query, update, Student.class); //修改
mongoTemplate.remove(query, Student.class); //删除
Query对象:
//创建Query对象,创建Criteria
Query query = new Query();
//精准条件
Criteria.where("key").is("条件")
//模糊条件
Criteria.and("key").regex("条件")
//封装
query.addCriteria(criteria)
GUI:
MongoDB Compass Community
7.MongoDB关系
- 嵌入式关系
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"contact": "987654321",
"dob": "01-01-1991",
"name": "Tom Benzamin",
"address": [
{
"building": "22 A, Indiana Apt",
"pincode": 123456,
"city": "Los Angeles",
"state": "California"
},
{
"building": "170 A, Acropolis Apt",
"pincode": 456789,
"city": "Chicago",
"state": "Illinois"
}]
}
一次查询
>db.users.findOne({"name":"Tom Benzamin"},{"address":1})
- 引用式关系
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"contact": "987654321",
"dob": "01-01-1991",
"name": "Tom Benzamin",
"address_ids": [
ObjectId("52ffc4a5d85242602e000000"),
ObjectId("52ffc4a5d85242602e000001")
]
}
两次查询,先查地址id,再根据地址id查对应地址
>var result = db.users.findOne({"name":"Tom Benzamin"},{"address_ids":1})
>var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})