发布于 

实习笔记-MongoDB

一、MongoDB简介

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。

MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

MongoDB存储形式
MongoDB存储形式

spring-data-mongodb提供了MongoTemplate与MongoRepository两种方式访问mongodb。

  • MongoRepository操作简单
  • MongoTemplate操作灵活

二、基于MongoTemplate的CRUD

2.1 MongoTemplate常用方法

  • mongoTemplate.findAll(User.class): 查询User文档的全部数据;
  • mongoTemplate.findById(, User.class): 查询User文档id为id的数
  • mongoTemplate.find(query, User.class): 根据query内的查询条件查询
  • mongoTemplate.upsert(query, update, User.class): 修改
  • mongoTemplate.remove(query, User.class): 删除
  • mongoTemplate.insert(User): 新增

2.2 Query对象

  1. 创建一个query对象(用来封装所有条件对象),再创建一个criteria对象(用来构建条件)
  2. 精准条件:criteria.and(“key”).is(“条件”);模糊条件:criteria.and(“key”).regex(“条件”)
  3. 封装条件:query.addCriteria(criteria)
  4. 大于(创建新的criteria):Criteria gt = Criteria.where(“key”).gt(“条件”)
    小于(创建新的criteria):Criteria lt = Criteria.where(“key”).lt(“条件”)
  5. Query.addCriteria(new Criteria().andOperator(gt,lt));
  6. 一个query中只能有一个andOperator()。其参数也可以是Criteria数组;
  7. 排序 :query.with(new Sort(Sort.Direction.ASC, “age”). and(new Sort(Sort.Direction.DESC, “date”)))
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/**
* 添加操作
*/
@Test
void add() {
User user = new User();
user.setAge(21);
user.setName("test1");
user.setEmail("1234@qq.com");
User insert = mongoTemplate.insert(user);
System.out.println(insert);
}

/**
* 查询操作
*/
@Test
public void findAll(){
List<User> all = mongoTemplate.findAll(User.class);
System.out.println(all);
}

/**
* 根据id查询
*/
@Test
public void findByUserId(){
User user = mongoTemplate.findById("65897012463177319db018cf", User.class);
System.out.println(user);
}

/**
* 条件查询
*/
@Test
public void findUserList(){
Query query = new Query(Criteria.where("name").is("test1").and("age").is(21));
List<User> users = mongoTemplate.find(query, User.class);
System.out.println(users);
}

/**
* 模糊查询
*/
@Test
public void findLikeUserList(){
String name = "st";
String regex = String.format("%s%s%s", "^.*", name, ".*$");
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Query query = new Query(Criteria.where("name").regex(pattern));
List<User> users = mongoTemplate.find(query, User.class);
System.out.println(users);
}

/**
* 分页查询(带条件)
*/
@Test
public void pageLikeUserList(){
int pageNo = 1; //设置当前页
int pageSize = 3; //设置每页显示的记录数

//条件构建
String name = "est";
String regex = String.format("%s%s%s", "^.*", name, ".*$");
Pattern pattern = Pattern.compile(regex,Pattern.CASE_INSENSITIVE);
Query query = new Query(Criteria.where("name").regex(pattern));

//分页构建
//查询数来集合(表)中的总记录数
long count = mongoTemplate.count(query, User.class);
List<User> users = mongoTemplate.find(query.skip((pageNo - 1) * pageSize).limit(pageSize), User.class);
System.out.println(count);
System.out.println(users);
}

/**
* 修改操作
*/
@Test
public void updateUser(){
//根据id查询
User user = mongoTemplate.findById("65897012463177319db018cf", User.class);
//修改值
user.setName("test_02");
user.setAge(2);
user.setEmail("test_02@qq.com");

//调用方法实现修改
Query query = new Query(Criteria.where("_id").is(user.getId()));
Update update = new Update();
update.set("name",user.getName());
update.set("age",user.getAge());
update.set("email",user.getEmail());
//调用mongoTemplate的修改方法实现修改
UpdateResult upsert = mongoTemplate.upsert(query, update, User.class);
long modifiedCount = upsert.getModifiedCount();//获取到修改受影响的行数
System.out.println("受影响的条数:"+modifiedCount);
}

/**
* 删除条件
*/
@Test
public void deleteUser(){
Query query = new Query(Criteria.where("age").is(21));
DeleteResult remove = mongoTemplate.remove(query, User.class);
long deletedCount = remove.getDeletedCount();
System.out.println("删除的条数:"+deletedCount);
}

三、基于MongoRepository的CRUD

Spring Data提供了对mongodb数据访问的支持,只需要继承MongoRepository类,按照Spring Data规范就可以了。

3.1 规范编写

SpringData方法定义规范:

SpringData规范
SpringData规范
SpringData规范
SpringData规范
  1. 不能随便声明,要符合一定的规范;
  2. 查询方法要以find/read/get开头;
  3. 涉及到条件查询时,条件的属性用条件关键字连接;
  4. 条件属性的首字母需要大写;
  5. 支持属性的级联查询,但若当前类有符合条件的属性则优先使用,而不使用级联属性,若需要使用级联属性,则属性之间使用_强制进行连接。

3.2 条件查询

使用 Example example = Example.of(user);封装查询条件

1
2
3
4
5
6
7
8
9
10
//条件查询
@Test
public void findUserList(){
User user = new User();
user.setName("ertong");
user.setAge(20);
Example<User> example = Example.of(user);
List<User> all = userRepository.findAll(example);
System.out.println(all);
}

3.3 模糊条件查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//模糊条件查询
@Test
public void findLikeUserList(){
///创建匹配器,即如何使用查询条件
ExampleMatcher matcher = ExampleMatcher.matching()//构建对象
.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)//改变默认字符串匹配方式:模糊查询
.withIgnoreCase(true);//改变默认大小写忽略方式:忽略大小写

User user = new User();
user.setName("e");
user.setAge(20);
Example<User> example = Example.of(user,matcher);
List<User> all = userRepository.findAll(example);
System.out.println(all);
}

3.4 分页查询

1
2
3
4
5
6
7
8
9
10
11
12
13
//分页查询
@Test
public void findPageUserAll(){
//设置分页参数
//0代表第一页
Pageable pageable = PageRequest.of(0, 3);
//查询条件
User user = new User();
user.setName("test");
Example<User> userExample = Example.of(user);//查询条件
Page<User> page = userRepository.findAll(userExample, pageable);
System.out.println(page.getContent());
}

四、业务中实现

4.1 分页查询

以dj_admin中分页查询所有金币任务为例:

1
2
3
4
5
6
7
8
9
10
11
12
public PageResponseBean<GoldTask> queryList(GoldTask goldTask, int page, int size) {
PageRequest pageRequest = PageRequest.of(page - 1, size, Sort.by("incrId").descending());
ExampleMatcher matcher = MongoMatcher.goldTaskMatcher();
if (StringUtils.isNotBlank(goldTask.getFilterRule())) {
matcher = MongoMatcher.goldTaskMatcherFilterRule();
}
MongoMatcher.clearBeanBlankProperty(goldTask);
Example<GoldTask> example = Example.of(goldTask, matcher);
Page<GoldTask> pageList = goldTaskRepository.findAll(example, pageRequest);
this.setListFilterRule(pageList);
return new PageResponseBean<>(pageList.getContent(), (int) pageList.getTotalElements(), size, page);
}

4.2 规范编写

还是以dj_admin中根据类型发布状态查询:

1
2
3
public List<GoldTask> queryByShowAdWallAndStatus(int showAdWall, int status) {
return goldTaskRepository.findByShowAdWallAndStatusAndIsDel(showAdWall, status, Constants.IsDel.NO);
}

本站由 Cccccpg 使用 Stellar 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。