MongoDB 介绍概述
基础概念
MongoDB 是非关系型数据库,也就是nosql,存储json数据格式会非常灵活,要比数据库mysql/MariaDB更好,同时也能为mysql/MariaDB分摊一部分的流量压力。
对于经常读写的数据他会存入内存,如此一来对于热数据的并发性能是相当高的,从而提升整体的系统效率。
另外呢,对于非事务的数据完全可以保存到MongoDB中,这些数据往往也是非核心数据。
一般来说,我们可以把一些非重要数据但是读写却很大的数据存储在MongoDB,比如我们自己的物流危化运输的车辆运行轨迹,GPS坐标,以及大气监测的一些动态指标等数据。又或者说咱们实战中的友情链接,友情链接在首页,这数据本身不重要,但是在首页里会经常被读到,并发读很大,所以放mongoDB中没毛病。
此外,mongodb提供的gridfs提供小文件存储,可以自己把控接口读取的权限,可以去限制,这一点也是有优势的,比如存储一些身份证信息啊,人脸信息啊都是可以的。
以下是MongoDB和数据库以及ElasticSearch(es没接触过的,待后续整合es后可以回过头来对比看看)的术语对比:
- MongoDB可以创建多个数据库(同mysql)
- 一个数据库可以创建多个collection(同mysql创建多表)
- 一个集合可以包含很多文档数据(同mysql一张表包含很多行记录)
我们可以通过如下代码片段来更好的理解MongoDB的数据对比,假设这张表中总记录有3条:
UserList: [
{
userId: "1001",
username: "lee",
age: 18
{
userId: "1002",
username: "jay",
age: 20,
sex: "boy"
},
{
userId: "1003",
username: "jolin",
age: 19,
sex: "girl"
}
]
如上述代码中:
- UserList是一个
collection
,在mysql中可以当做是一张表 - UserList中的每个
{}
都是一个json对象,他们称之为document文档
,在mysql中称之为行记录 - userId、username、age、sex 这些都是
field 域
,在MySQL中称之为column列字段 field 域可有可无,这样是非常灵活的,例如第一个dicument文档,中sex域是没有的
Docker 安装配置MongoDB
安装
docker pull mongo:6.0.3
运行 mongodb:
docker run --name mongo \
-p 28028:27017 \
--restart always \
-d mongo:6.0.3 \
--auth
- -p 27017:27017 :端口映射
- --auth :开启密码访问
至此安装成功~!
配置admin账号
docker exec -it mongo mongo admin
报错:
原因:MongoDB 的5.x以上的版本使用mongo来执行mongodb命令已经不支持了,需要改用mongosh
来替代mongo
docker exec -it mongo mongosh admin
创建admin账号
db.createUser({ user:'admin',pwd:'imooc',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});
测试成功
db.auth('admin', 'admin')
MongoDB - HR职位信息举报
举报功能对于这个系统来讲,可有可无,举报量可能比较大,mysql数据库存储的瓶颈可能很快就会达到,解决数据库瓶颈会把一部分数据迁移到其他存储介质。
采用MongoDB原因
1.可有可无的数据
2.非常庞大的增加数据
MongoDB其他应用:日志的存储
整合MongoDB
pom父工程:
XML
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
<version>3.12.11</version>
</dependency>
pojo中引入:
整合springboot,使用springboot提供的
XML
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
为什么放在pojo微服务里?
不仅仅在我们的web里使用MongoDB,还会使用MongoDB相应的对象,有映射关系,以及ElasticSearch也有对应映射类,使用映射类,就会使用MongoDB的依赖坐标
配置文件( web-业务微服务模块)
uri: mongodb://username:password@localhost:27017/database
你需要替换username
、password
、localhost
和database
为你的MongoDB服务器的实际用户名、密码、地址和数据库名
其他服务排除依赖
因为pojo服务引入了MongoDB依赖,AB服务引入了pojo依赖,A服务使用MongoDB,B服务不使用,不使用的则要在自动装配里排除
启动类操作如下:
代码实现
controller: 举报信息的MO对象:
@Ids:生成相应主键
service:
数据层调用:
使用Springboot内部集成的JPA,String,为id的类型
结果:
调用成功后新增了一张表
MongoDB - 限制重复举报
controller
service
impl
mapper
根据接口名字findByReportUserIdAndJobId实现条件过滤操作
验证时候要保证数据只有一条,因为返回的类型为对象
MongoDB - 查询举报记录
页面效果
vue-vue视图界面
vue-data()对象
vue-api
controller
因为MongoDB数据库存储时间是带有时间时分秒
BO
service
impl
java
@Autowired
private MongoTemplate mongoTemplate;
@Override
public PagedGridResult pagedReportRecordList(SearchReportJobBO reportJobBO,
Integer page,
Integer pageSize) {
String jobName = reportJobBO.getJobName();
String companyName = reportJobBO.getCompanyName();
String reportUserName = reportJobBO.getReportUserName();
Integer dealStatus = reportJobBO.getDealStatus();
LocalDateTime beginDate = reportJobBO.getBeginDateTime();
LocalDateTime endDate = reportJobBO.getEndDateTime();
// 1. 创建查询对象
Query query = new Query();
// 2. 创建条件对象
//Criteria criteria = new Criteria();
// 3. 设置查询条件参数
if (StringUtils.isNotBlank(jobName)) {
query = addLikeByValue(query, "job_name", jobName);
}
if (StringUtils.isNotBlank(companyName)) {
query = addLikeByValue(query, "company_name", companyName);
}
if (StringUtils.isNotBlank(reportUserName)) {
query = addLikeByValue(query, "report_user_name", reportUserName);
}
if (dealStatus != null) {
query.addCriteria(Criteria.where("deal_status").is(dealStatus));
}
if (beginDate != null && endDate == null) {
query.addCriteria(Criteria.where("created_time").gte(beginDate));
} else if (beginDate == null && endDate != null) {
query.addCriteria(Criteria.where("created_time").lte(endDate));
} else if (beginDate != null && endDate != null) {
query.addCriteria(Criteria.where("created_time").gte(beginDate).lte(endDate));
}
// 4. 查询记录总数,必须在分页前查询,否则总数不对
long counts = mongoTemplate.count(query, ReportMO.class);
// 5. 设置分页,Direction:方向
Pageable pageable = PageRequest.of(page,
pageSize,
Sort.Direction.DESC,
"created_time");
query.with(pageable);
// 6. 执行查询
List<ReportMO> list = mongoTemplate.find(query, ReportMO.class);
// 7. 封装分页grid信息数据
PagedGridResult gridResult = new PagedGridResult();
gridResult.setRows(list);
gridResult.setPage(page);
gridResult.setRecords(counts);
return gridResult;
}
private Query addLikeByValue(Query query, String key, String value) {
// 拼接 正则表达式和查询参数
Pattern pattern = Pattern.compile("^.*" + value + ".*$");
// 指定要查询的属性
query.addCriteria(Criteria.where(key).regex(pattern));
return query;
}
MongoDB是文档类型数据库,全部是json数据,当在Navicat里复制一条数据时,全部变成String和数字类型,之前字段为DateTime类型或其他类型会失效,修改类型进行测试