公司的技术栈是SpringCloud+ZoomKeeper+RabbitMq+JPA+MongoDB,利用zk去做配置文件,rabbitmq做一些异步处理,持久层采用JPA(数据库的Mysql),对于大部分都是查询的业务,数据是存在MongoDB中。

MongoDB是一个高性能、开源、无模式的文档型数据库,是当前NoSql数据库中比较热门的一种。 适合对大量或者无固定格式的数据进行存储,比如:日志、缓存等。对事物支持较弱,不适用复杂的多文档(多表)的级联查询。

MongoDB的适用场景:

  1. 在应用服务器的日志记录
  2. 存储一些监控数据
  3. 应用不需要事务及复杂 join 支持
  4. 应用需要2000-3000以上的读写QPS
  5. 应用需要TB甚至 PB 级别数据存储
  6. 应用发展迅速,需要能快速水平扩展
  7. 应用要求存储的数据不丢失
  8. 应用需要99.999%高可用
  9. 应用需要大量的地理位置查询、文本查询

下面就讲下SpringBoot利用MongoTemplate操作mongdb

1. MongDB的安装

安装MongDB可以看官网安装

英语不好的小伙伴可以看这个安装

我是在centos7.0上安装的MongDB4.2,修改配置文件,加入用户和密码,下面的linux详细命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
[root@VM-0-15-centos ~]# docker pull mongo:4.2.6
Trying to pull repository docker.io/library/mongo ...
4.2.6: Pulling from docker.io/library/mongo
23884877105a: Pull complete
bc38caa0f5b9: Pull complete
2910811b6c42: Pull complete
36505266dcc6: Pull complete
a4d269900d94: Pull complete
5e2526abb80a: Pull complete
d3eece1f39ec: Pull complete
358ed78d3204: Pull complete
1a878b8604ae: Pull complete
dde03a2883d0: Pull complete
4ffe534daa34: Pull complete
f164ba21e17c: Pull complete
6494c387442c: Pull complete
Digest: sha256:c880f6b56f443bb4d01baa759883228cd84fa8d78fa1a36001d1c0a0712b5a07
Status: Downloaded newer image for docker.io/mongo:4.2.6
[root@VM-0-15-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/mysql 5.7 2c9028880e58 9 days ago 447 MB
docker.io/tomcat 9.0.45-jdk8-adoptopenjdk-hotspot bcf990bea01a 10 days ago 341 MB
docker.io/mongo 4.2.6 3f3daf863757 13 months ago 388 MB
docker.io/rabbitmq 3.7.15-management f05c3eb3cf91 22 months ago 179 MB
[root@VM-0-15-centos ~]# docker run -td --name mongo -p 27017:27017 3f3daf863757 --auth
44d090fd4314773ac4362298eadf5928feda9c347b50dd0ff17c40c32cb00128
[root@VM-0-15-centos ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
44d090fd4314 3f3daf863757 "docker-entrypoint..." 4 seconds ago Up 3 seconds 0.0.0.0:27017->27017/tcp
[root@VM-0-15-centos ~]# docker exec -it mongo mongo admin
MongoDB shell version v4.2.6
connecting to: mongodb://127.0.0.1:27017/admin?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("cb9f0916-53bc-4781-aa95-4409477eb89b") }
MongoDB server version: 4.2.6
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
> db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});
Successfully added user: {
"user" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
},
"readWriteAnyDatabase"
]
}
> db.auth('admin', '123456')
1
> ^C
bye
[root@VM-0-15-centos ~]# docker restart 44d090fd4314
44d090fd4314
[root@VM-0-15-centos ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
44d090fd4314 3f3daf863757 "docker-entrypoint..." 47 minutes ago Up 3 seconds 0.0.0.0:27017->27017/tcp

2. 添加Maven依赖

只需要加入web启动器和mongdb依赖即可

1
2
3
4
5
6
7
8
9
 <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 添加mongodb依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

3. 添加配置文件

我们提前在MongoDB中创建一个test库,并在下面的配置信息中加入刚刚配置的用户名和密码,需要注意的是密码需要用单引号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
spring:
data:
mongodb:
host: 127.0.0.1
port: 27017
database: test
option:
max-connection-idle-time: 1500
max-connection-per-host: 200
max-wait-time: 60000
max-connection-life-time: 0
connect-timeout: 10000
socket-timeout: 60000
password: '123456'
username: admin
authentication-database: admin

4. 编写实体类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* @author 路飞
* @create 2021/5/22 10:10
*/
@Data
@Document(collation = "user")
public class User {
@Id
private Integer id;
private Integer age;
private String name;
private String role;


public User(Integer id, Integer age, String name, String role) {
this.id = id;
this.age = age;
this.name = name;
this.role = role;
}
}

5. 编写DAO层

SpringBoot已经为我们高度封装了MongoTemplate,类似RedisTemplate

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class MongoTestDao {

@Autowired
private MongoTemplate mongoTemplate;

/**
* 创建对象
* @param user
*/
public void save(User user){
mongoTemplate.save(user);
}

/**
* 根据id查询对象
* @param id
* @return
*/
public User findUserById(Integer id){
Query query = new Query(Criteria.where("name").is(id));
User user = mongoTemplate.findOne(query, User.class);
return user;
}

public void updateUserById(User user){
Query query = new Query(Criteria.where("id").is(user.getId()));
Update update = new Update().set("age", user.getAge()).set("name", user.getName());
//更新查询结果中的第一条数据
mongoTemplate.updateFirst(query,update,User.class);
}

/**
* 根据id删除
* @param id
*/
public void deleteUserById(Integer id){
Query query = new Query(Criteria.where("id").is(id));
mongoTemplate.remove(query,User.class);
}
}

6. 测试用例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
@SpringBootTest
class SpringbootMongodbApplicationTests {

@Autowired
private MongoTestDao mongoTestDao;

@Test
public void addUser() {
for (int i = 0; i < 100; i++) {
mongoTestDao.save(new User(i,i,String.valueOf(i+1),String.valueOf(i+100)));
}
System.out.println("#####插入完毕!######");
}

@Test
public void updateUser(){
for (int i = 0; i < 100; i++) {
mongoTestDao.updateUserById(new User(i,i-1000,"A","a"));
}
System.out.println("#####修改完毕!######");
}

@Test
public void deleteUser(){
for (int i = 0; i < 100; i++) {
mongoTestDao.deleteUserById(i);
}
System.out.println("#####修改完毕!######");
}

@Test
public void findUserById(){
for (int i = 0; i < 100; i++) {
User user = mongoTestDao.findUserById(i);
System.out.println(i+"-----------"+user);
}
System.out.println("#####查询完毕!######");
}
}

测试通过,放一张用MongDB Compass连接MongDB的图

7. GitHub代码

springboot-mongodb