【MongoDB】SpringBoot整合MongoDB

【MongoDB】SpringBoot整合MongoDB

文章目录

  • 【MongoDB】SpringBoot整合MongoDB
    • [0. 准备工作](#0. 准备工作)
    • [1. 集合操作](#1. 集合操作)
      • [1.1 创建集合](#1.1 创建集合)
      • [1.2 删除集合](#1.2 删除集合)
    • [2. 相关注解](#2. 相关注解)
    • [3. 文档操作](#3. 文档操作)
      • [3.1 添加文档](#3.1 添加文档)
      • [3.2 批量添加文档](#3.2 批量添加文档)
      • [3.3 查询文档](#3.3 查询文档)
        • [3.3.1 查询所有文档](#3.3.1 查询所有文档)
        • [3.3.2 根据id查询](#3.3.2 根据id查询)
        • [3.3.3 等值查询](#3.3.3 等值查询)
        • [3.3.4 范围查询](#3.3.4 范围查询)
        • [3.3.5 and查询](#3.3.5 and查询)
        • [3.3.6 or查询](#3.3.6 or查询)
        • [3.3.7 and or 查询](#3.3.7 and or 查询)
        • [3.3.8 排序](#3.3.8 排序)
        • [3.3.9 分页查询](#3.3.9 分页查询)
        • [3.3.10 查询总条数](#3.3.10 查询总条数)
        • [3.3.11 去重](#3.3.11 去重)
        • [3.3.12 json字符串查询](#3.3.12 json字符串查询)
      • [3.4 修改文档](#3.4 修改文档)
      • [3.4.1 更新单条文档](#3.4.1 更新单条文档)
        • [3.4.2 批量更新文档](#3.4.2 批量更新文档)
        • [3.4.3 修改或插入文档](#3.4.3 修改或插入文档)
      • [3.5 删除文档](#3.5 删除文档)
        • [3.5.1 删除所有文档](#3.5.1 删除所有文档)
        • [3.5.2 条件删除](#3.5.2 条件删除)

0. 准备工作

引入依赖:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

1. 集合操作

1.1 创建集合

创建一个 "products" 集合,如果不存在则创建,存在则不创建。

java 复制代码
@Test
public void createCollection() {
    //不存在集合则创建
    if (!mongoTemplate.collectionExists("products")) {
        mongoTemplate.createCollection("products");
    }
}

1.2 删除集合

java 复制代码
@Test
public void dropCollection() {
    mongoTemplate.dropCollection("products");
}

2. 相关注解

  • @Document
    • 修饰范围:用在类上
    • 作用:用来映射这个类的一个对象为 mongo 中一条文档数据
    • 属性:{value、collection} 用来指定操作的集合名称
  • @Id
    • 修饰范围:用在成员变量、方法上
    • 作用:用来将成员变量的值映射为文档的 _id 的值
  • @Field
    • 修饰范围:用在成员变量、方法上
    • 作用:用来将成员变量以及值映射为文档中一个 key,value 对
    • 属性:{name,value} 用来指定在文档中key的名称,默认为成员变量名
  • @Transient
    • 修饰范围:用在成员变量、方法上
    • 作用:用来指定某个成员变量不参与文档的序列化

3. 文档操作

首先创建一个 User 类,给它一些基本属性。

java 复制代码
@Data
@AllArgsConstructor
@NoArgsConstructor
//表示类实例代表mongo中一条文档
@Document("users")
public class User {
    private Integer id;
    private String name;
    private Double salary;
    private Date birthday;
}

3.1 添加文档

向 users 集合中添加文档:

java 复制代码
@Test
public void saveDocument() {
    User user = new User(1, "zhj", 25000.0, new Date());
    //mongoTemplate.save(user);
    mongoTemplate.insert(user);
}
  • insert():插入重复数据时,该方法会报异常提示主键重复。
  • save():对已经存在的数据进行更新。它的功能就是 saveOrUpdate

3.2 批量添加文档

java 复制代码
@Test
public void batchSaveDocument() {
    List<User> users = Arrays.asList(
            new User(3, "张三", 25000.0, new Date())
            , new User(4, "李四", 25000.0, new Date())
    );
    mongoTemplate.insert(users,User.class);
}

批量添加建议使用 insert() 方法,可以一次性插入整个数据,效率更高。


3.3 查询文档


3.3.1 查询所有文档

java 复制代码
List<User> users = mongoTemplate.findAll(User.class);
//List<User> users1 = mongoTemplate.findAll(User.class, "users");

3.3.2 根据id查询

java 复制代码
User user = mongoTemplate.findById(1, User.class);

3.3.3 等值查询

java 复制代码
List<User> users1 = mongoTemplate.find(Query.query(Criteria.where("name").is("zs")), User.class);

3.3.4 范围查询

java 复制代码
List<User> users2 = mongoTemplate.find(Query.query(Criteria.where("salary").gt(30000)), User.class);

3.3.5 and查询

java 复制代码
List<User> users3 = mongoTemplate.find(Query.query(Criteria.where("name").is("zs").and("salary").is(25000)), User.class);

3.3.6 or查询

java 复制代码
Criteria criteria = new Criteria();
criteria.orOperator(
        Criteria.where("name").is("张三"),
        Criteria.where("name").is("李四")
);
List<User> users4 = mongoTemplate.find(Query.query(criteria), User.class);

3.3.7 and or 查询

java 复制代码
List<User> users5 = mongoTemplate.find(Query.query(Criteria.where("salary").is(25000.0).orOperator(Criteria.where("name").is("zs"))), User.class);

3.3.8 排序

java 复制代码
Query query = new Query();
query.with(Sort.by(Sort.Order.asc("id")));
List<User> users6 = mongoTemplate.find(query, User.class);

3.3.9 分页查询

java 复制代码
Query pageQuery = new Query();
//查询第一页数据,每页展示两条数据
pageQuery.with(Sort.by(Sort.Order.desc("id")))
        .skip(0)
        .limit(2);
List<User> users7 = mongoTemplate.find(pageQuery, User.class);

3.3.10 查询总条数

java 复制代码
long count = mongoTemplate.count(new Query(), User.class);
System.out.println("总条数为:" + count);

3.3.11 去重

java 复制代码
List<String> names = mongoTemplate.findDistinct(new Query(), "name", User.class, String.class);

3.3.12 json字符串查询

java 复制代码
BasicQuery basicQuery = new BasicQuery("{name:'zs'}");
List<User> users8 = mongoTemplate.find(basicQuery, User.class);

3.4 修改文档

3.4.1 更新单条文档

java 复制代码
Update update = new Update();
update.set("salary",300000.0);
//更新符合条件的第一条数据
mongoTemplate.updateFirst(Query.query(Criteria.where("name").is("zs")),update,User.class);

3.4.2 批量更新文档

java 复制代码
Update update = new Update();
update.set("salary",300000.0);
//将所有满足条件的文档都修改
mongoTemplate.updateMulti(Query.query(Criteria.where("name").is("zs")),update,User.class);

3.4.3 修改或插入文档

java 复制代码
Update update = new Update();
update.set("id",6);
update.set("salary", 300000.0);
//没有符合条件的数据,则插入数据
mongoTemplate.upsert(Query.query(Criteria.where("name").is("ls")),update,User.class);

如果没有包含"ls"这条文档,那么就会插入"ls"这条文档,但是如果id重复,那么就会抛出异常。

java 复制代码
Update update = new Update();
update.set("salary", 300000.0);

//没有符合条件的数据,则插入数据
UpdateResult upsert = mongoTemplate.upsert(Query.query(Criteria.where("name").is("ww")), update, User.class);

//获取本次修改记录条数
long modifiedCount = upsert.getModifiedCount();
System.out.println(modifiedCount);
//获取本次匹配的记录条数
long matchedCount = upsert.getMatchedCount();
System.out.println(matchedCount);
//当集合种没有对应的文档,那么就插入文档,获得插入文档自动生成的id
System.out.println(upsert.getUpsertedId());

3.5 删除文档

3.5.1 删除所有文档

java 复制代码
mongoTemplate.remove(new Query(),User.class);

3.5.2 条件删除

java 复制代码
mongoTemplate.remove(Query.query(Criteria.where("name").is("ls")),User.class);

相关推荐
PGCCC28 分钟前
【PGCCC】Postgresql 存储设计
数据库·postgresql
码上一元2 小时前
SpringBoot自动装配原理解析
java·spring boot·后端
计算机-秋大田2 小时前
基于微信小程序的养老院管理系统的设计与实现,LW+源码+讲解
java·spring boot·微信小程序·小程序·vue
PcVue China2 小时前
PcVue + SQL Grid : 释放数据的无限潜力
大数据·服务器·数据库·sql·科技·安全·oracle
魔道不误砍柴功4 小时前
简单叙述 Spring Boot 启动过程
java·数据库·spring boot
锐策4 小时前
〔 MySQL 〕数据库基础
数据库·mysql
枫叶_v4 小时前
【SpringBoot】22 Txt、Csv文件的读取和写入
java·spring boot·后端
路在脚下@4 小时前
Springboot 的Servlet Web 应用、响应式 Web 应用(Reactive)以及非 Web 应用(None)的特点和适用场景
java·spring boot·servlet
远歌已逝5 小时前
管理Oracle实例(二)
数据库·oracle
日月星宿~5 小时前
【MySQL】summary
数据库·mysql