SpringBoot整合MongoDB

embedded/2024/10/15 19:12:18/

目录

  • 什么是MongoDB?
  • Spring Boot整合MongoDB
  • 使用MongoDB
    • 1.新增文档
    • 2.修改文档
    • 3.删除文档
    • 4.查询文档
    • 5.创建索引

什么是MongoDB?

MongoDB是一种开源的 分布式文档型数据库管理系统 ,它使用类似于JSON的BSON格式(Binary JSON)来存储数据。

MongoDB使用集合(Collections)来组织文档(Documents),每个文档都是由键值对组成的。

  • 数据库(Database):存储数据的容器,类似于关系型数据库中的数据库。
  • 集合(Collection):数据库中的一个集合,类似于关系型数据库中的表。
  • 文档(Document):集合中的一个数据记录,类似于关系型数据库中的行(row),以 BSON 格式存储。

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成,文档类似于 JSON 对象,字段值可以包含其他文档,数组及文档数组:
文档
使用场景:

使用场景
网站数据存储游戏开发
物流与电商社交网络
内容管理系统视频直播和流媒体
缓存系统大数据分析

Spring Boot整合MongoDB

  • 引用依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
  • 配置连接信息
# MongoDB连接信息
# 配置IP
spring.data.mongodb.host = 192.168.23.27  
# 配置端口号
spring.data.mongodb.port = 27017
# 定义连接的数据库名
spring.data.mongodb.database = mall
#用于控制MongoDB数据库是否自动创建索引。
spring.data.mongodb.auto-index-creation = true
  • 定义实体类Person
@Document(collection = "person") // 指定集合名称,就是类似mysql的表,如果不指定就以类名称作为集合名称
@Data
public class Person {@Id // 文档id, 很重要,类似mysql表的主键private String id;private String name;private Integer age;
}

使用MongoDB

1.新增文档

注入MongoDb操作类,其中封装DML、DQL等操作

@Autowired
private MongoTemplate mongoTemplate;

添加单条数据:

//填充数据Person person =new Person();person.setId("1");person.setName("张三");person.setAge(26);
//插入数据        
mongoTemplate.insert(person);

添加多条数据:

List<Person> list = new ArrayList<>();
for (int i = 0; i < 20; i++) {Person person = new Person();person.setName("张三" + i);person.setAge(20+i);list.add(person);
}
//批量添加数据
Collection<Person> people = mongoTemplate.insertAll(list);

存储文档,如果没有该数据就插入,否则更新数据:

/**
* 存储文档,如果没有该数据就插入,否则更新数据
* 在存储文档的时候会通过主键 ID 进行判断,如果存在就更新,否则就插入
*/
@Test
public void save() throws Exception {
//填充数据Person person =new Person();person.setId("1");person.setName("张三");person.setAge(26);
//存储数据
mongoTemplate.save(person);
}

2.修改文档

根据条件修改数据:

//设置修改条件
Query query = new Query();
Criteria criteria = Criteria.where("name").is("张三");
query.addCriteria(criteria);
//设置修改的数据
Update update = new Update();
update.set("name", "李四");
//执行修改操作
UpdateResult updateResult = template.updateFirst(query, update, Person.class);

3.删除文档

删除指定文档:

//设置删除条件
Query query = new Query();
Criteria name = new Criteria().and("name").is("张三1");
Criteria age = new Criteria().and("age").is(26);
query.addCriteria(name);
query.addCriteria(age);
//执行删除操作
Person person = mongoTemplate.findAndRemove(query, Person.class);

删除符合条件的所有文档,并返回删除的文档:

// 使用 in 删除 符合条件的多条文档,并返回
Query query = new Query(Criteria.where("id").in(1,2,3));
List<Person> result = mongoTemplate.findAllAndRemove(query, Person.class);

4.查询文档

MongoDB 支持的多种操作符:
在这里插入图片描述
查询集合中的全部文档数据:

List<Person> result = mongoTemplate.findAll(Person.class);

查询集合中指定的ID文档数据:

Person result = mongoTemplate.findById("1", Person.class);

根据条件查询集合中符合条件的文档,返回第一条数据:

//查询name是"张三3"的Person
Query query = new Query(Criteria.where("name").is("张三3"));
Person result = mongoTemplate.findOne(query, Person.class);

根据条件查询所有符合条件的文档:

//查询age大于18的Person
Query query = new Query(Criteria.where("age").gt(18));
List<Person> result = mongoTemplate.find(query, Person.class);

据【AND】关联多个查询条件,查询集合中所有符合条件的文档数据:

// 创建条件
Criteria name = Criteria.where("name").is("张三");
Criteria age = Criteria.where("age").is(18);
// 创建条件对象,将上面条件进行 AND 关联    where  name='张三' and age = 18
Criteria criteria = new Criteria().andOperator(name, age);
// 创建查询对象,然后将条件对象添加到其中
Query query = new Query(criteria);
List<Person> result = mongoTemplate.find(query, Person.class);
System.out.println("查询结果:" + result.toString());

根据【OR】关联多个查询条件,查询集合中的文档数据:

// 创建条件
Criteria criteriaUserName = Criteria.where("name").is("张三");
Criteria criteriaPassWord = Criteria.where("age").is(22);
// 创建条件对象,将上面条件进行 OR 关联  where  name='张三' or age = 22
Criteria criteria = new Criteria().orOperator(criteriaUserName, criteriaPassWord);
// 创建查询对象,然后将条件对象添加到其中
Query query = new Query(criteria);
List<Person> result = mongoTemplate.find(query, Person.class);
System.out.println("查询结果:" + result.toString());

根据【IN】关联多个查询条件,查询集合中的文档数据:

// 设置查询条件参数
List<Long> ids = Arrays.asList("1", "2", "3");
// 创建条件
Criteria criteria = Criteria.where("id").in(ids);
// 创建查询对象,然后将条件对象添加到其中
Query query = new Query(criteria);
List<Person> result = mongoTemplate.find(query, Person.class);
System.out.println("查询结果:" + result.toString());

根据【逻辑运算符】查询集合中的文档数据:

// 设置查询条件参数
int min = 20;
int max = 35;
Criteria criteria = Criteria.where("age").gt(min).lte(max);
// 创建查询对象,然后将条件对象添加到其中
Query query = new Query(criteria);
List<Person> result = mongoTemplate.find(query, Person.class);
System.out.println("查询结果:" + result.toString());

根据【正则表达式】查询集合中的文档数据:

// 设置查询条件参数
String regex = "^张";
Criteria criteria = Criteria.where("name").regex(regex);
// 创建查询对象,然后将条件对象添加到其中
Query query = new Query(criteria);
List<Person> result = mongoTemplate.find(query, Person.class);
System.out.println("查询结果:" + result.toString());

5.创建索引

创建升序索引:

// 设置字段名称
String field = "age";
// 创建索引
mongoTemplate.getCollection("person").createIndex(Indexes.descending(field));

根据索引名称移除索引:

// 设置字段名称
String field = "age_1";
// 删除索引
mongoTemplate.getCollection("person").dropIndex(field);

查询集合中所有的索引:

// 获取集合中所有列表
ListIndexesIterable<Document> indexList = mongoTemplate.getCollection("person").listIndexes();
// 获取集合中全部索引信息
for (Document document : indexList) {System.out.println("索引列表:" + document);
}

http://www.ppmy.cn/embedded/98691.html

相关文章

C++ 设计模式——策略模式

策略模式 策略模式主要组成部分例一&#xff1a;逐步重构并引入策略模式第一步&#xff1a;初始实现第二步&#xff1a;提取共性并实现策略接口第三步&#xff1a;实现具体策略类第四步&#xff1a;实现上下文类策略模式 UML 图策略模式的 UML 图解析 例二&#xff1a;逐步重构…

【区块链+金融服务】“吉惠通”一站式金融综合服务平台 | FISCO BCOS应用案例

释放数据要素价值&#xff0c;FISCO BCOS 2024 应用案例征集 核心企业拥有良好的企业信誉&#xff0c;但有时会由于无可传递的信任背书&#xff0c;而无法为其他环节供应商提供融资支持&#xff0c;无 法促进产业链条良性发展&#xff1b;金融机构难以得到有议价空间的、弹性的…

Apache Flink细粒度资源管理原理

粗粒度资源管理 Apache Flink 1.1.4版本之前使用的是粗粒度的资源管理&#xff0c;即每个算子Slot Request所需要的资源都是未知的&#xff0c;Flink内部用UNKNOWN的特殊值来表示&#xff0c;这个值可以和任意资源规则的物理Slot匹配&#xff0c;站在Taskmanager的角度&#x…

MySQL键分区分区表

什么是键分区分区表&#xff1f; 键分区是一种MySQL数据库中的分区策略&#xff0c;它基于某个列的键值将数据分割成不同的分区。每个键值都会被映射到一个唯一的分区&#xff0c;这样可以确保数据在不同分区中均匀分布。键分区广泛应用于MySQL Cluster环境中&#xff0c;它可…

Ruby模板引擎:构建动态视图的艺术

标题&#xff1a;Ruby模板引擎&#xff1a;构建动态视图的艺术 在Ruby on Rails的世界里&#xff0c;模板引擎是构建动态网页的基石。它们允许开发者将服务器端的逻辑嵌入到HTML中&#xff0c;实现数据的动态展示。本文将深入探讨Ruby中几种常用的模板引擎&#xff0c;包括ERB…

JAVA_7

JAVA_7 JAVA面向对象编程1. 抽象方法和抽象类 JAVA面向对象编程 1. 抽象方法和抽象类 使用abstract修饰的方法&#xff0c;没有方法体&#xff0c;只有声明。定义的是一种“规范”&#xff0c;就是告诉子类必须要给抽象方法提供具体的实现。包含抽象方法的类就是抽象类。通过…

鸿蒙内核源码分析(异常接管篇) | 社会很单纯,复杂的是人

为何要有异常接管? 拿小孩成长打比方&#xff0c;大人总希望孩子能健康成长&#xff0c;但在成长过程中总会遇到各种各样的问题&#xff0c;树欲静而风不止&#xff0c;成长路上有危险&#xff0c;有时是自己的问题有时是外在环境问题.就像抖音最近的流行口水歌一样&#xff…

autocommit自动提交事务及commit、rollback用法

MySQL默认开启事务自动提交&#xff0c;每条SQL语句都会被当做一个单独的事务自动执行。 一、查看autocommit自动提交事物状态 SHOW VARIABLES LIKE ‘autocommit’; 1、开启状态&#xff1a;ON autocommit的值为ON&#xff0c;表示系统开启自动提交模式 2、关闭状态&#…