参考链接
- https://www.mongodb.org.cn/
文章目录
- 一、前言
- 1.1 NoSQL介绍
- 1.1.1 NoSQL 数据库分类
- 1.1.2 NoSQL的优点/缺点
- 1.1.3 BASE
- 1.2 MongoDB介绍
- 1.2.1 MongoDB和SQL对比
- 1.2.2 数据库
- 1.2.3 元数据
- 1.2.4 MongoDB 数据类型
- 二、SpringBoot整合MongDB
- 2.1 环境配置
- 2.2 MongoTemplate
一、前言
1.1 NoSQL介绍
NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。
NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
1.1.1 NoSQL 数据库分类
1.1.2 NoSQL的优点/缺点
优点:
- 高可扩展性
- 分布式计算
- 低成本
- 架构的灵活性,半结构化数据
- 没有复杂的关系
缺点:
- 没有标准化
- 有限的查询功能(到目前为止)
- 最终一致是不直观的程序
1.1.3 BASE
BASE:Basically Available, Soft-state, Eventually Consistent。 由 Eric Brewer 定义。
CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。
BASE是NoSQL数据库通常对可用性及一致性的弱要求原则:
- Basically Availble --基本可用
- Soft-state --软状态/柔性事务。 “Soft state” 可以理解为"无连接"的, 而 “Hard state” 是"面向连接"的
- Eventual Consistency --最终一致性 最终一致性, 也是是 ACID 的最终目的。
1.2 MongoDB介绍
1.2.1 MongoDB和SQL对比
需要注意的是:
- 文档中的键/值对是有序的。
- 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
- MongoDB区分类型和大小写。
- MongoDB的文档不能有重复的键。
- 文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
文档键命名规范:
- 键不能含有\0 (空字符)。这个字符用来表示键的结尾。
- .和$有特别的意义,只有在特定环境下才能使用。
- 以下划线"_"开头的键是保留的(不是严格要求的)。
1.2.2 数据库
- admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
- local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
- config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
1.2.3 元数据
数据库的信息是存储在集合中。它们使用了系统的命名空间:
dbname.system.*
在MongoDB数据库中名字空间 .system.* 是包含多种系统信息的特殊集合(Collection),如下:
1.2.4 MongoDB 数据类型
二、SpringBoot整合MongDB
2.1 环境配置
引入MongoDB库
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
配置端口和连接MongoDB数据库信息
server:
port: 8090
spring:
data:
mongodb:
uri: mongodb://localhost:27017/test
2.2 MongoTemplate
添加实体类User
package com.ym.learn.db.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable;
/**
* @Author: Yangmiao
* @Date: 2023/3/19 22:19
* @Desc: User实体类
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Document(value = "t_user")
public class User implements Serializable {
private String name;
private String password;
private int age;
private String tel;
}
测试
package com.ym.learn.db.controller;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import com.ym.learn.core.entity.R;
import com.ym.learn.db.entity.User;
import com.ym.learn.db.repository.mapper.mongo.UserMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Optional;
/**
* @Author: Yangmiao
* @Date: 2023/3/20 17:40
* @Desc:
*/
@RestController("/mongo")
@Slf4j
public class MongoController {
@Autowired
private MongoTemplate mongoTemplate;
@Autowired
private UserMapper userMapper;
@GetMapping("/addUser")
public R addUser(){
User user = User.builder()
.name("xiaoming")
.age(10)
.password("123")
.build();
User insert = mongoTemplate.insert(user);
return R.ok(insert);
}
@GetMapping("/deleteUser")
public R deleteUser(){
Query query = Query.query(Criteria.where("name").is("lisi").and("age").is(10));
DeleteResult remove = mongoTemplate.remove(query);
return R.ok(remove);
}
@GetMapping("/updateUser")
public R updateUser(){
Query query = Query.query(Criteria.where("name").is("xiaoming"));
Update update = Update.update("name", "lisi");
UpdateResult result = mongoTemplate.updateFirst(query, update, User.class);
return R.ok(result);
}
@GetMapping("queryUser/{name}")
public R queryUser(@PathVariable("name")String name){
Query query = Query.query(Criteria.where("name").is(name));
User user = mongoTemplate.findOne(query, User.class);
if (user == null){
return R.fail("未查询到该用户:"+name);
}
return R.ok(user);
}
@GetMapping("/queryUser/repos/{name}")
public R queryUserByRepos(@PathVariable("name")String name){
Optional<User> userOptional = userMapper.findById(name);
userOptional.ifPresent(it->{
log.debug("print user: "+it.toString());
});
User user = userOptional.orElse(new User());
return R.ok(user);
}
}