一 什么是MongoDB
1 MonnoDB介绍
MongoDB 是在2007年由DoubleClick公司的几位核心成员开发出的一款分布式文档数据库,由C++语言编写。
目的是为了解决数据大量增长的时候系统的可扩展性和敏捷性。MongoDB要比传统的关系型数据库简单很多。
2 MonnoDB的数据类型
在MongoDB中数据主要的组织结构就是`数据库、集合和文档`,文档存储在集合当中,集合存储在数据库中。
MongoDB中每一条数据记录就是一个文档,数据结构由键值(key=>value)对组成`。
文档类似于 JSON 对象,它的数据结构被叫做`BSON`(Binary JSON)。
下表将帮助您更容易理解MongoDB中的一些概念:
| RDBMS | MongoDB |
| ------ | -------- |
| 数据库 | 数据库 |
| 表格 | 集合 |
| 行 | 文档 |
| 列 | 字段 |
| 表联合 | 嵌入文档 |
| 主键 | _id |
3 MongoDB使用的场景
3.1 MongoDB适用场景
MongoDB不需要去明确指定一张表的具体结构,对字段的管理非常灵活,有很强的可扩展性。
支持高并发、高可用、高可扩展性,自带数据压缩功能,支持海量数据的高效存储和访问。
支持基本的CRUD、数据聚合、文本搜索和地理空间查询功能。
适用场景:
- 网站数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
- 高伸缩性的场景:Mongo非常适合由数十或数百台服务器组成的数据库。
- 大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。
- 缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的持久化缓存层可以避免下层的数据源过载。
例如:
弹幕、直播间互动信息、朋友圈信息、物流场景等
3.2 不适用场合
- 高度事务性系统:例如银行系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。
- 传统的商业智能应用:针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。
二 安装和启动
1 docker拉取MongoDB镜像
docker pull mongo:7.0.0
2 启动容器
docker run -d --restart=always -p 27017:27017 --name mongo -v /opt/mongo/data/db:/data/db mongo:7.0.0
3 进入mongoDB容器
docker exec -it mongo mongosh
之后就可以执行MonnoDB的命令了
三 springboot集成MongoDB
1 准备工作
1.1 创建项目,引入mongodb依赖
这里基于springboot1.0.5版本
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.atguigu</groupId>
<artifactId>mongo_demo01</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<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>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
1.2 引入依赖
<!--mongodb-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
1.3 配置文件
spring:
data:
mongodb:
database: daijia
host: 192.168.2.129
port: 27017
1.4 创建实体类
注意:@Document("user") //指定mongodb中的集合名字
@Id private ObjectId id; 指定集合中的主键
package org.itheima.learnmongodb.Demo;
import lombok.Data;
import org.bson.types.ObjectId;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.Date;
@Data
@Document("user") //指定mongodb中的集合名字
public class User {
@Id
private ObjectId id;
private String name;
private Integer age;
private String email;
private Date createDate;
}
2 两种实现方式之一:MongoRepository
2.1 定义一个配置类注入MongoRepository
编写一个接口来继承MongoRepository,后面两个泛型,一个是我们的在Mongo中的集合,另一个是主键的数据类型
public interface UserRepository extends MongoRepository<User, ObjectId> {
}
2.2 添加
创建一个集合对象,向对象加入数字
@Autowired
private UserRepository userRepository;
//添加
@Test
public void add() {
User user = new User();
user.setName("mary");
user.setAge(30);
user.setCreateDate(new Date());
userRepository.save(user);
}
@Test
public void add() {
User user = new User();
user.setName("shuaicjx");
user.setAge(100000000);
user.setCreateDate(new Date());
userRepository.save(user);
}
2.3 查询所有
//查询所有
@Test
public void findAll() {
List<User> list = userRepository.findAll();
System.out.println(list);
}
2.4 根据id查询并排序
//根据id查询
@Test
public void testFindById() {
Optional<User> optional =
userRepository.findById(new ObjectId("666a9a85f5294513720647ff"));
boolean present = optional.isPresent();
if(present) {
User user = optional.get();
System.out.println(user);
}
}
2.5 分页查询
创建一个分页对象,其中第一个参数是所在页码,第二个参数是每一页查询多少条消息
//分页查询
@Test
public void testPage() {
//第一页从0开始的
PageRequest pageable = PageRequest.of(0,2);
Page<User> page = userRepository.findAll(pageable);
List<User> list = page.getContent();
System.out.println(list);
}
2.6 更新
这里的更新方法也是save方法,和添加方法一样。区别在于,更新是有id的,添加是没有id的
//更新
@Test
public void testUpdateUser(){
//注意:先查询,再更新
Optional<User> optional = userRepository.findById(
new ObjectId("66dede1377ece30a104cffc0")
);
if(optional.isPresent()){
User user = optional.get();
user.setAge(100);
//user中包含id,就会执行更新
userRepository.save(user);
System.out.println(user);
}
}
2.7 删除
//删除
@Test
public void testDeleteUser(){
userRepository.deleteById(
new ObjectId("66dede1377ece30a104cffc0")
);
}
我们来删除mary
删除前:
删除后:
3 两种方法实现方式之二:MongoTemplate
3.1 向类中注入实现类
不需要去设置配置类
@Autowired
private MongoTemplate mongoTemplate;
3.2 添加
//添加
@Test
public void add() {
User user = new User();
user.setName("test");
user.setAge(20);
user.setCreateDate(new Date());
mongoTemplate.insert(user);
}
3.3 查询所有
//查询所有
@Test
public void findAll() {
List<User> list = mongoTemplate.findAll(User.class);
list.forEach(user->{
System.out.println(user);
});
}
3.4 根据id查询
public void testFindId() {
User user = mongoTemplate.findById("66deeaa19132116c7f02c674", User.class);
System.out.println(user);
}
3.5 条件查询
//条件查询
public void testCondition() {
// where name=? and age=?
Criteria criteria =
Criteria.where("name").is("test").and("age").is(20);
Query query = new Query(criteria);
List<User> list = mongoTemplate.find(query,User.class);
System.out.println(list);
}
3.6 分页查询
//分页查询
@Test
public void testPage() {
// limit 0,2
Query query = new Query();
List<User> list = mongoTemplate.find(query.skip(0).limit(2), User.class);
list.forEach(user->{
System.out.println(user);
});
}
3.7 修改
//修改
@Test
public void testUpdateUser() {
Criteria criteria = Criteria.where("_id").is("66deeaa19132116c7f02c674");
Query query = new Query(criteria);
Update update = new Update();
update.set("name", "zhangsan");
update.set("age", 99);
UpdateResult result = mongoTemplate.upsert(query, update, User.class);//改一条
//UpdateResult result = mongoTemplate.updateMulti(query, update, User.class);//改多条
long count = result.getModifiedCount();
System.out.println(count);
}
改之前:
改之后:
3.8 删除
@Test
public void testRemove() {
Criteria criteria = Criteria.where("_id").is("66deeaa19132116c7f02c674");
Query query = new Query(criteria);
DeleteResult result = mongoTemplate.remove(query, User.class);
long count = result.getDeletedCount();
System.out.println(count);
}
删之前:
删之后: