# 响应式数据库MongoDB

img

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是一个半结构化的非关系型数据库,他是非关系数据库当中功能最丰富,最像关系数据库的,同时有着分布式的存储架构,可以有效解决海量数据存储于高并发访问效率问题。

# 介绍

# 应用场景

MongoDB是介于关系型数据库和纯粹的分布式数据库中间的产品

  • 适用于在海量低价值数据存储并对数据实时处理有较高要求的场景中适用

相比mysql+redis技术完整度更高,但是额外增加了学习成本

  • 适用于做数据缓冲层

由于MongoDB可以高效的处理数据,可以作为缓存层,降低持久化层压力

  • 适用于高度的伸缩性

MongoDB可以提供集群化服务,在数据量存储逐渐增长的同时也不会影响整体性能

  • 树形结构、父子关系

直接文档式存储

# RDBMS与NoSQL对比

RDBMS:Relational Database Management System -> Oracle、Mysql、SQLServer

NoSQL:Not Only SQL

RDBMS - 高度组织化结构化数据 - 结构化查询语言(SQL) - 数据和关系都存储在单独的表中。 - 数据操纵语言,数据定义语言 - 严格的一致性 - 基础事务

NoSQL - 代表着不仅仅是SQL - 没有声明性查询语言 - 没有预定义的模式 -键 - 值对存储,列存储,文档存储,图形数据库 - 最终一致性,而非ACID属性 - 非结构化和不可预知的数据 - CAP定理 - 高性能,高可用性和可伸缩性

# MongoDB的特性

# 多语言支持

支持java、c、c#、c++、Python、node.js、js、php等....

# 多元查询

  • 关系型数据库的单表查询
  • 范围查询
  • 排序
  • 聚合计算 sum、AVG、count、group等
  • MapReduce
  • 支持索引

# 存储

  • 文档

BSON(Binary JSON),是改良后的JSON格式,使用的是二进制的格式存储数据比JSON的存储类型更加丰富,比如音视频、图片、对象等。

另外存储文档时不需要预先定义数据结构和类型

  • 集合

MongoDB使用集合存储数据,他和mysql中的表相似,一个集合中可以存储海量的文档。

# 分布式集群架构

  • 副本机制

可以实现实时备份、故障转移、数据不丢失

  • 大数据自动切分

可以通过统一路由实现服务横向扩容、存储与访问负载均衡

# 数据库操作

# 常用命令

# 数据库命名

# db

查看当前使用的数据库

# use

切换数据库,在数据库不存在的时候创建数据库

use <database>

#

查看所有数据库

# 插入

# db.collection.insert

image-20200902165647346

如果没有指定_id字段,数据库会自动给这个字段赋值

# 查询

# db.xxoo.find

image-20200902165942057

# SpringData MongoDB

https://spring.io/projects/spring-data-mongodb

# 依赖

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-mongodb</artifactId>
		</dependency>
1
2
3
4

# SpringData Reactive MongoDB

# 依赖

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>
				spring-boot-starter-data-mongodb-reactive
			</artifactId>
		</dependency>
1
2
3
4
5
6

# Log

personDao.findAll().log()
1

# WebClient

webClient提供了异步网络调用的方法

# retrieve()

retrieve()方法是获取响应主体并对其编码的方法

# 构造方式

WebClient client = WebClient.create()
1

# 异步调用

client.get().uri("http://localhost:8080/findAll").retrieve().bodyToFlux(Person.class)
1

# 参数传递

client.get().uri("http://localhost:8080/findbyid?id={id}","3").retrieve().bodyToFlux(Person.class);
	
1
2

# 指定响应类型

	Flux<Person> bodyToFlux = client.get().uri("http://localhost:8080/findbyid?id={id}","3").accept(MediaType.APPLICATION_JSON).retrieve().bodyToFlux(Person.class);
	
1
2

# 异常处理

				Flux<Person> bodyToFlux = client.get().uri("http://localhost:8080/findbyid?id={id}","3")
						.accept(MediaType.APPLICATION_JSON).retrieve()
						.onStatus(HttpStatus::is5xxServerError, clientResp ->
						Mono.error(new Exception("我错了!"))
								)
						
						.bodyToFlux(Person.class);
1
2
3
4
5
6
7