11 MongoDB

本文是读《Spring Boot2精髓-从构建小系统到架构分布式大系统》的读书笔记。

MongoDB 由 C++语言编写,是一个基于分布式文件存储的开源数据库系统,支持的数据结构为 BSON 格式,类似 JSON 的一种格式,因此可以存储非常复杂的数据

11.1 安装MongoDB

https://www.mongodb.com/

mongod ,启动 Mon goDB 数据库 。 通常需要指定一个数据存放的目录,默认是/data/db 。如果启动的时候没有创建/data/巾,则会启动失败。可以通过—dbpath 参数指定特定的目录,参数详情可以键入./mongod -help。
mongo ,启动一个 S hell ./mongo ,通过 s he ll 可以对 MongoDB 进行增删 改查等操作。
mon godump ,备份数据库 。
mongorestore,恢复数据库 。

11.2 使用shell

在编写 Spring Boot 代码操作 MongoDB 前,使用 She ll 来操作 MongoDB , 对数据进行增删改查。如前所述 , MongoDB 是面向文档的数据库,文档使用 JSON 格式,准确地说 , 应该是BSON , 一种二进制压缩、带类型的 J SON 格式 。

./mongo
//baike是数据库
>use baike
>db.auth (” test ”,” 123 屯 abc ! ” )

指定数据库
通过 use 命令可以指定使用的数据库,如果数据库不存在,则创建一个,以下命令从 baike
数据库切换到 test2 数据库 :
插入 文档
MongoDB 通过集合( Co llection )来管理数据库,类似于数据库表,集合包含了多个文档
( Document ),文档类似于数据库衰的记录。 MongoDB 不需要显式地创建集合,可以直接给集合添加文挡,比如给 baike 集合添加一个条目。

>db .baike.insert({ id :” springboot ”, desc :”快速分布式开发框架 ”,
tag : [IT,”Spring”) , comment : {good : l256,bad : l2} })

baike 是集合的名字,当不存在集合的时候会自动创建此集合。 insert 方法用于以 JSON 格
式插入一个文档
_id, MongoDB 以下画线开头的字段都有特殊意义 , 表示文档主键

若文档没有提供此主键,则系统自动生成一个ObjectID类型的主键,ObjectID是MongoDB的一种特殊类型,用12个字节存储。
查询 文档
MongoDB 支持按照主键查询,也可以根据条件进行查询,支持类似 and or in 等操作。
举例条件查询:

>db . baike.find({ id :” springbo。t ” })
{ ” _ id ”:” springboot ”,” desc ” : ” 快速分布式开发框架” , ” tag ” :[ ” IT ”, ” Spring ”],
” comment " : { ” good”: 1256,”bad”: 12 } }

MongoliaDB支持全文搜索,但中文支持不好,而且搜索效率较低,全文搜索可以参考后面的Elasticsearch
更新操作

>db .baike . updateOne({ id:” springboot” }, {$set :{” desc ”:”基于 spring 的分
布式开发框架 ” }});

replaceOne 与 updateOne 的 区别在于前者是替换整个文档,而后者是更新部分文档 。这两个方法都只替换匹配的第一条记录,如果有多条记录匹配,可以使用 updateMany 。
删除操作

db.baike .deleteMany({})
db .baike . deleteOne({ id:”springboot " })

11.3 Spring Boot集成MongoDB

pom中添加

<dependency>
	<groupid>org.springframework .boot</groupid>
	<artifactid>spring-boot-starter-data-mongodb</artifactid>
</dependency>

还需要在配置文件 application .properties 中配置 MongoDB 的链接地址:

spring.data.mongodb.uri=mongodb://127.0.0.1:27017/baike
spring.data.mongodb.uri=mongodb://test :123%25abc!@127.0.0.1:27017/baike

11.4 增删改查

增加API
insert新增一个文档,save新增或者更新文档对象。
对象名字的首字母小写变成 MongoDB 集合的名称,如 Baike对象在 MongoDB 中集合名字是 baike 。

	@GetMapping("/addbaike")
	public Baike addDict(Baike baike){
		baike.setCrateDate(new Date());
		mongoTemplate.insert(baike);
		return baike ;
	}

以上代码向 MongoDB 中新增了 一个百科文档 , 考虑到测试的方便,使用了 GetMapping ,
如果要使用 PostMapping,可以通过 curl 命令来进行测试。在浏览器中输入 :

http://127 . 0 . 0 . 1 : 8080/addbaike?id=beetlsql&desc=dao 工具& tag[O]=
IT&comment.bad=l

为了测试方便 , 使用了@GetMapping 来添加或者修改文档,实际上使用@PostMapping 更好。
引申:
http的post请求:客户端数据放在HTML HEADER内提交。
http的get请求:通过URL提交数据,数据在URL中能看到,1024个字节,参数直接暴露在URL上。
根据主键查询API
mongoTemplate 提供了 findById ,用于根据主键查找文档,并映射到 Java 对象:

	@GetMapping("/baike/{name}")
	public Baike findUser(@PathVariable String name){
		
		Baike dict = mongoTemplate.findById(name, Baike.class);
		return dict ;
	}

通过浏览器输入:

http : //127.0.0.1:8080/baike/beetlsql

会有以下输出 :

{ ” id ”:” beetlsql ”,” desc ”:” dao 工具 ”,” tag ”: [ ” I T ” ] ,” comment ” :{ ” good ”: 0 ,” bad ”: 1},” crateDate”: 1498831559404,”update Date ” : null}

查询API

通过 Criteria 类构造查询条件,调用 find 方法查找。比如查询 comment 的 bad 属性大于一
定数量的 Baike 对象 :

	@GetMapping("/querybad/{bad}")
	public List<Baike> queryBad(@PathVariable int bad){
		Criteria criteria = where("comment.bad").gt(bad);;		
		List<Baike> list = mongoTemplate.find(query(criteria), Baike.class);
		return list ;
	}
	

query方法构造了 一个 Query 对象,还可以调用 limit 方法限定返回的个数 ,调用 ski p 方法从指定的行数开始。以下是一个翻页查询 :

@GetMapping("/baike/tag/{tag}/{pageNum}")
	public List<Baike> findBaike(@PathVariable String tag,@PathVariable int pageNum){
		Criteria criteria = where("tag").in(tag);
		Query query =  query(criteria);
		//查询总数
		long totalCount = mongoTemplate.count(query, Baike.class);
        //每页个数 
		int numOfPage = 10;
		//计算总数
        long totalPage = totalCount%numOfPage==0?(totalCount/numOfPage):(totalCount/numOfPage+1);            
       
        int skip = (pageNum-1)*numOfPage;  
        query.skip(skip).limit(numOfPage);
        List<Baike> list = mongoTemplate.find(query, Baike.class);
        return list;
	}

修改API
Query 类可以参考 11.4.3 节, Update 对象用于构造 MongoDB 的叩date 语句 。 upd ateFirst
更新符合条件的第一条记录, updateMulti 更新所有记录。

	@GetMapping("/baike/tag/{tag}")
	public @ResponseBody String addOne(@PathVariable String tag){
		Criteria criteria = where("tag").in(tag);	
		Update update = new Update();
		update.inc("comment.good", 1);
		UpdateResult result = mongoTemplate.updateMulti(query(criteria), update, Baike.class);		
		return "成功修改 "+result.getModifiedCount() ;
	}

通过浏览器输入以下 URL , 所有 tag 包含 IT 的点赞数自增一个 :

http://127 . 0. 0 .1 : 8080/baike/tag/IT

删除API

	@GetMapping("/updatebaike")
	public Baike updateDict(Baike baike){
		baike.setUpdateDate(new Date());
		mongoTemplate.save(baike);
		return baike ;
	}

通常,无论是在MongoDB 中的文档还是数据库的数据,都要尽量避免物理删除 。 建议为
Baike 增加一个status , 用于表示是否删除 , 通过 11.4.4 节的 update 方法来进行逻辑删
除 。

使用MongoDatabase

打印日志
mongoTemplate 提供了大量 API 来访问 MongoDB ,通过配置日志等级来了解访问细节,设
置如下 :

logging . level.org . springframework . data . mongodb=debug

        

你可能感兴趣的:(Spring,Boot精髓)