MongoDB
MongoDB
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
Mongo是一种NoSql数据库,:
1.对数据库高并发读写。
2、对海量数据的高效率存储和访问。
3、对数据库的高可扩展性和高可用性
使用场景
适用场景
1、网站数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
2、缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由M ongo搭建的持久化缓存层可以避免下层的数据源过载。
3、大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵, 在此之前,很多时候程序员往往会选择传统的文件进行存储。
4、高伸缩性的场景:Mongo非常适合由数十或数百台服务器组成的数据库。Mongo的路线图中已经包含对Map Reduce弓摩的内置支持。
5、用于对象及 JSON数据的存储:Mongo的BSON数据格式非常适合文档化格式的存储 及查询。
不适用场合
1、高度事务性的系统:例如银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。
2、传统的商业智能应用:针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。
安装
windows
下载mongodb
- 官网下载 选择msi
- 进入引导界面,选择Custom自定义安装路径
- 之后会默认让安装compass可视化工具,可以不下载之后下第三方的
- 一路next
安装为服务
- 通过msi下载的mongdb会自动生成data和log目录
还会在bin目录下自动生成mongod.cfg配置文件,里面写了data和log目录的位置
进入bin目录,执行以下代码,将mongodb注册为服务
1
2# 报错可能是没有用管理员权限,或者mongod.cfg要输入全路径名
mongod --config mongod.cfg --install --serviceName "MongoDB" --journal服务相关命令(管理员身份运行)
1
2
3启动服务:net start MongoDB
关闭服务:net stop MongoDB
移除服务(bin目录下):mongod.exe --remove
下载可视化工具
Download Studio 3T for MongoDB | Windows, macOS & Linux
- 下载完解压,再安装
- 测试连接localhost:27017
通过docker安装
拉取镜像
1
docker pull mongo:latest
创建和启动容器
1
docker run -d --restart=always -p 27017:27017 --name mymongo -v /data/db:/data/db -d mongo
测试
1
2
3
4
5
6# 进入容器
docker exec -it mymongo /bin/bash
# 使用mongoDB客户端进行操作
mongo
# 查询所有数据库
show dbs
概念
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
常用命令
1 |
|
集合
对应关系型数据库中的表
1 |
|
记录
对应关系型数据库中的字段
1 |
|
SpringBoot 整合MongoDB
spring-data-mongodb提供了MongoTemplate与MongoRepository两种方式访问mongodb,MongoRepository操作简单,MongoTemplate操作灵活,可以灵活适用这两种方式操作mongodb,MongoRepository的缺点是不够灵活,MongoTemplate正好可以弥补不足。
常用注解
注解 | 说明 |
---|---|
@Document | 标示映射到Mongodb文档上的领域对象 |
@Id | 将相应字段设置为主键 |
@Indexed | 标示某个字段为Mongodb的索引字段,提高该字段的检索速度 |
@Query | 可以用Mongodb的JSON查询语句进行查询 |
操作
MongoTemplate
导入依赖
1
2
3
4<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>添加配置
1
2
3
4
5spring:
data:
# 连接地址 端口号 连接的数据库
mongodb:
uri: mongodb://127.0.0.1:27017/mall-port添加实体类
1
2
3
4
5
6
7
8
9
10
11@Data
@Document("User") //对应MongoDb中的表名
public class User {
@Id
private String id;
private String name;
private Integer age;
private String email;
private String createDate;
}测试使用
插入、查询
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@SpringBootTest
class DemoMongoDBApplicationTest {
@Autowired
private MongoTemplate mongoTemplate;
// insert 插入数据
@Test
public void create() {
User user = new User();
user.setAge(20);
user.setName("test");
user.setEmail("111@qq.com");
User user1 = mongoTemplate.insert(user);
System.out.println(user1);
}
// findAll 查询所有数据
@Test
public void findAll() {
List<User> all = mongoTemplate.findAll(User.class);
System.out.println(all);
}
// findById 通过id查询
@Test
public void findById() {
User user = mongoTemplate.findById("634c047f1bda8149e63ff1ee", User.class);
System.out.println(user);
}
// 条件查询
@Test
public void findUserList() {
// 构建条件
Query query = new Query(Criteria
.where("name").is("test")
.and("age").is(20));
List<User> userList = mongoTemplate.find(query, User.class);
System.out.println(userList);
}
// 模糊条件查询
@Test
public void findLikeUserList() {
// 构建正则
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));
List<User> userList = mongoTemplate.find(query, User.class);
System.out.println(userList);
}
// 分页查询
@Test
public void findPageUserList() {
int current = 1;
int size = 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); //记录数
// skip(当前页的开始下标).limit(查询页数)
List<User> userList = mongoTemplate.find(query.skip((current - 1) * size).limit(size), User.class);
System.out.println("总记录数:" + count);
System.out.println(userList);
}
}修改、删除
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// 修改
@Test
public void updateUser() {
User user = mongoTemplate.findById("634c047f1bda8149e63ff1ee", User.class);
user.setName("asdasdasd");
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());
// 通过查询条件查询出数据,更新的属性
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("_id").is("634c047f1bda8149e63ff1ee"));
DeleteResult remove = mongoTemplate.remove(query, User.class);
long deletedCount = remove.getDeletedCount();
System.out.println(deletedCount);
}
MongoRepository
添加Repository类
1
2
3@Repository
public interface UserRepository extends MongoRepository<User, String> {
}CRUD
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@SpringBootTest
class DemoMongoDBApplicationTest1 {
@Autowired
private UserRepository userRepository;
// save 插入数据
@Test
public void create() {
User user = new User();
user.setAge(20);
user.setName("张三");
user.setEmail("3332200@qq.com");
User user1 = userRepository.save(user);
}
// findAll 查询所有数据
@Test
public void findAll() {
List<User> all = userRepository.findAll();
System.out.println(all);
}
// findById 通过id查询
@Test
public void findById() {
User user = userRepository.findById("634c06471bda8149e63ff1ef").get();
System.out.println(user);
}
// 条件查询
@Test
public void findUserList() {
// 构造查询条件
User user = new User();
user.setAge(20);
Example<User> userExample = Example.of(user);
List<User> users = userRepository.findAll(userExample);
System.out.println(users);
}
// 模糊条件查询
@Test
public void findLikeUserList() {
//创建匹配器,即如何使用查询条件
ExampleMatcher matcher = ExampleMatcher.matching() //构建对象
.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询
.withIgnoreCase(true); //改变默认大小写忽略方式:忽略大小写
User user = new User();
user.setName("三");
Example<User> userExample = Example.of(user, matcher);
List<User> userList = userRepository.findAll(userExample);
System.out.println(userList);
}
// 分页查询
@Test
public void findPageUserList() {
Pageable page = PageRequest.of(0, 3);
Page<User> pages = userRepository.findAll(page);
System.out.println(pages);
}
// 修改
@Test
public void updateUser() {
User user = userRepository.findById("635fc9b4d74a3c02b054754a").get();
user.setName("王五");
userRepository.save(user); // 有相同id时为修改
}
// 删除
@Test
public void deleteUser() {
userRepository.deleteById("635fc9b4d74a3c02b054754a");
}
}
实例
springBoot 版本2.7.8
导入坐标
1
2
3
4
5<!--Spring Data MongoDB-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>编写配置
1
2
3
4
5spring:
data:
mongodb:
# 连接地址 端口号 连接的数据库
uri: mongodb://127.0.0.1:27017/mall-port编写映射到mongodb的文档对象
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/**
* 用户商品浏览历史记录
*/
@Data
@Document
public class MemberReadHistory {
@Id
private String id;
@Indexed
private Long memberId;
private String memberNickname;
private String memberIcon;
@Indexed
private Long productId;
private String productName;
private String productPic;
private String productSubTitle;
private String productPrice;
private Date createTime;
}编写操作类
1
2
3
4@Repository
public interface MemberReadHistoryRepository extends MongoRepository<MemberReadHistory, String> {
List<MemberReadHistory> findBy MemberIdOrderByCreateTimeDesc(Long memberId);
}编写Service接口、实现接口
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@Service
public class MemberReadHistoryServiceImpl implements MemberReadHistoryService {
@Resource
private MemberReadHistoryRepository memberReadHistoryRepository;
@Override
public int create(MemberReadHistory memberReadHistory) {
memberReadHistory.setId(null);
memberReadHistory.setCreateTime(new Date());
memberReadHistoryRepository.save(memberReadHistory);
return 1;
}
@Override
public int delete(List<String> ids) {
List<MemberReadHistory> deleteList = new ArrayList<>();
for(String id : ids){
MemberReadHistory memberReadHistory = new MemberReadHistory();
memberReadHistory.setId(id);
deleteList.add(memberReadHistory);
}
memberReadHistoryRepository.deleteAll(deleteList);
return ids.size();
}
@Override
public List<MemberReadHistory> list(Long memberId) {
return memberReadHistoryRepository.findByMemberIdOrderByCreateTimeDesc(memberId);
}
}编写Controller
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@Api(tags = "会员商品浏览记录管理")
@RestController("/member/readHistory")
public class MemberReadHistoryController {
@Resource
private MemberReadHistoryService memberReadHistoryService;
@ApiOperation("创建浏览记录")
@PostMapping("/create")
public CommonResult create(@RequestBody MemberReadHistory memberReadHistory) {
int count = memberReadHistoryService.create(memberReadHistory);
if (count > 0) {
return CommonResult.success(count);
} else {
return CommonResult.failed();
}
}
@ApiOperation("删除浏览记录")
@PostMapping(value = "/delete")
public CommonResult delete(@RequestParam("ids") List<String> ids) {
int count = memberReadHistoryService.delete(ids);
if (count > 0) {
return CommonResult.success(count);
} else {
return CommonResult.failed();
}
}
@ApiOperation("展示浏览记录")
@GetMapping(value = "/list")
public CommonResult<List<MemberReadHistory>> list(Long memberId) {
List<MemberReadHistory> memberReadHistoryList = memberReadHistoryService.list(memberId);
return CommonResult.success(memberReadHistoryList);
}
}测试