过往mongodb文档:
- https://blog.csdn.net/qq_46921028/article/details/123361633
- https://blog.csdn.net/qq_46921028/article/details/131136935
- https://blog.csdn.net/qq_46921028/article/details/139247847
1、MongoDB概述:
MongoDB中的一些概念:
RDBMS | MongoDB |
---|---|
数据库 | 数据库 |
表 | 集合 |
行 | 文档 |
列 | 字段 |
表联合 | 嵌入文档 |
主键 | _id |
- 官网地址:https://www.mongodb.com/
- 文档地址:https://docs.mongoing.com/
- 中文社区:https://www.mongodb.org.cn/
- 仓库地址:https://github.com/mongodb/mongo
2、MongoDB:适用场景:
引入某个技术前,需要了解它的特性、适用场景以及可以解决什么问题,而不是为了技术而技术。
适用于:
网站数据:MongoDB非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
高伸缩性的场景:MongoDB非常适合由数十或数百台服务器组成的数据库。
大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此,之前,很多时候程序员往往会选择传统的文件进行存储。
缓存:由于性能很高,MongoDB也适合作为信息基础设施的缓存层。在系统重启之后,由MongoDB搭建的持久化缓存层可以避免下层的数据源过载。
例如:弹幕、直播间互动信息、朋友圈信息、定理位置、物联网(比如 接入的设备信息、设备汇报的日志信息等)、物流(订单信息、订单状态等)场景等。
不适用场景:
3、MongoDB安装:(docker方式)
#拉取镜像
docker pull mongo:7.0.0
#创建宿主机上的mongodb数据目录
rm -rf /opt/mongo
mkdir -p /opt/mongo/data/db
#启动容器
docker run -d --restart=always -p 27017:27017 --name mongo -v /opt/mongo/data/db:/data/db
mongo 7.0.0
#进入容器,连接mongo客户端
docker exec -it mongo mongosh
#基础命令
show dbs #列出所有数据库
db.version() #当前db版本
db.getMongo() #查看当前db的连接机器地址
db.help() #帮助文档
quit() #退出命令行
1、创建数据:
如果数据库不存在,会自动创建数据库,否则就切换到指定数据库。
use 库名
2、查看当前数据库:
db.getName()
3、显示当前数据库状态:
db.stats()
4、删除当前数据库:
db.dropDatabase()
5、列出所有数据库:
show dbs 或 show databases
1、创建集合:(一般不需要我们手动创建,添加文档时会自动创建)
db.creataCollection("集合名称/表名")
2、删除集合:
db.集合名.drop()
文档是一组键值(key-vlue)对。MongoDB的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类
型,这与关系型数据库有很大的区别,也是MongoDB非常突出的特点。
需要注意的是:MongoDB区分类型和大小写,MongoDB的文档不能有重复的键。
1、新增文档:(insert)
向User集合插入一条记录。可以预先使用createCollection方法创建集合,也可以不创建集合,直接插入数据,那么集合会被自动创建。
db.user.insert({name:'张三',age:21,sex:true})
相关文档:https://www.runoob.com/mongodb/mongodb-insert.html
2、查询文档:(query)
查询当前User集合中所有的记录:
db.user.find()
查询当前User集合中name是张三的记录:(大括号里指定查询条件,是键值对格式的)
db.User.find({name:"张三"})
相关文档:https://www.runoob.com/mongodb/mongodb-query.html
3、修改文档:(update)
只更新匹配到的第一条记录:
//修改年龄为21岁的用户姓名
db.user.update({age:21},{$set:{name:'派蒙'}})
更新匹配到的所有记录:
//加上{multi:true}表示修改多条
db.User.update({age:21},{$set:{age:99}},{multi:true})
相关文档:https://www.runoob.com/mongodb/mongodb-update.html
4、删除文档:(remove)
删除一个文档:
db.user.remove(id)
删除所有文档:
db.user.remove({})
相关文档:https://www.runoob.com/mongodb/mongodb-remove.html
spring-data是专门操作数据库的,而spring-data-mongodb是操作mongo的,它提供了两种操作mongo的方式:
1、创建SpringBoot项目,引入mongodb相关依赖:
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.7.10version>
<relativePath/>
parent>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-mongodbartifactId>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
plugin>
plugins>
build>
2、配置mongodb连接信息:
spring:
data:
mongodb:
database: testdb
host: 127.0.0.1
port: 27017
logging:
level:
root: info
3、创建实体类:
package cn.aopmin.domain;
import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.Date;
/**
* 用户实体类
* @author 白豆五
* @since 2024/7/19
*/
@Data
@Document("user") //指定表名
public class User {
@Id
private String id;
private String name;
private Integer age;
private String email;
private String password;
private Date createTime;
}
import cn.aopmin.Launcher;
import cn.aopmin.domain.User;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
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 java.util.Date;
import java.util.List;
/**
* 使用MongoTemplate操作mongo
*
* @author 白豆五
* @since 2024/7/19
*/
@SpringBootTest(classes = Launcher.class)
public class MongoTemplateTest {
@Autowired
private MongoTemplate mongoTemplate;
// 添加
@Test
public void testInsert() {
User user = User.builder()
.name("test")
.age(20)
.createTime(new Date())
.build();
User obj = mongoTemplate.insert(user);
assert obj != null;
System.out.println("添加成功");
/*
NOTE:
insert() 和 save() 的区别:
1. insert() 如果对象没有id, 则会自动生成id, 并插入数据库;
如果对象有id, 则根据id更新对象
2. save() 如果对象没有id, 则会自动生成id, 并插入数据库
如果对象有id, 则会抛出异常
语法:
db.user.insert({
"name": "test",
"age": "20",
"createTime": ISODate("2024-07-19T09:09:09.000+08:00")
});
*/
}
// 查询所有
@Test
public void testFindAll() {
List<User> userList = mongoTemplate.findAll(User.class);
userList.forEach(System.out::println);
}
// 根据id查
@Test
public void testFindById() {
User user = mongoTemplate.findById("669a36442f07de177e4f92f5", User.class);
System.out.println("user = " + user);
}
// 条件查询
@Test
public void testCondition() {
// where name = 'test' and age = 20
List<User> userList = mongoTemplate.find(
// 查询条件,通过Criteria对象构建
Query.query(Criteria.where("name").is("test").and("age").is(20)),
// 查询结果类型
User.class
);
System.out.println("userList = " + userList);
}
// 分页查询
@Test
public void testPage() {
// 获取第1页, 每页2条数据
List<User> userList =
mongoTemplate.find(
// 查询条件
new Query()
.skip(0) // 跳过前0条数据
.limit(2), // 取2条数据
// 查询结果类型
User.class
);
System.out.println("userList = " + userList);
}
// 删除
@Test
public void testDelete() {
DeleteResult result = mongoTemplate.remove(
Query.query(Criteria.where("_id").is("669a36442f07de177e4f92f5")),
User.class
);
long count = result.getDeletedCount();
System.out.println("count = " + count);
}
// 修改
@Test
public void testUpdate() {
UpdateResult result = mongoTemplate.upsert(
// 查询条件
Query.query(Criteria.where("name").is("test")),
// 修改内容
Update.update("age", 21),
// 修改结果类型
User.class
);
// 影响行数
long count = result.getMatchedCount();
System.out.println("count = " + count);
}
}
仓库地址:https://gitee.com/aopmin/mongo-demo