Bootstrap

Spring Boot 整合 MongoDB:入门篇

MongoDB 作为一款 NoSQL 数据库,以其灵活的文档模型、高性能和可扩展性,成为了众多互联网应用的首选。而 SpringBoot 作为 Java 开发领域的明星框架,则以其简洁易用、快速开发的特点,为开发者提供了强大的支持。

今天,我们就来学习如何将 SpringBoot 与 MongoDB 结合使用。

入门篇:快速上手 MongoDB

安装 MongoDB

首先,我们需要安装 MongoDB。MongoDB 的安装非常简单,官方提供了各个平台的安装包,你只需要根据你的系统选择合适的安装包并按照步骤进行安装即可。

需要注意的是,在选择 Spring Data MongoDB 版本时,你需要确保其与你的 Spring Boot 版本兼容。可以参考 Spring Data MongoDB 的官方文档来查看兼容性表: https://docs.spring.io/spring-data/mongodb/reference/preface.html

我使用的是 [email protected] + JDK17 安装的 [email protected]

配置项目依赖

添加 spring-boot-starter-data-mongodb 依赖,它将为我们提供与 MongoDB 集成的功能。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

配置 MongoDB 连接

在 application.yml 文件中配置 MongoDB 连接信息,例如:

spring:
  data:
    mongodb:
      uri: mongodb://localhost:27017/uyii

创建实体类

定义一个简单的实体类,例如 User 类,包含 name 和 age 属性:

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

@Data
@Document(collection = "users")
public class User {

    @Id
    private String id;

    @Indexed(unique = true)
    private String name;

    private Integer age;
}

创建 Repos

itory 接口

使用 Repository 接口,并定义常用的 CRUD 操作方法:

package com.uyii.springbootmongo.repository;

import com.uyii.springbootmongo.model.User;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends MongoRepository<User, String> {
}

创建 Controller

使用 @RestController 注解标记 Controller 类,注入 Repository 接口,并编写 API 接口:

import com.uyii.springbootmongo.model.User;
import com.uyii.springbootmongo.repository.UserRepository;
import com.uyii.springbootmongo.vo.demoVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.aggregation.*;
import org.springframework.web.bind.annotation.*;

import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.MongoTemplate;

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private MongoTemplate mongoTemplate;

    // 添加
    @PostMapping
    public User createUser(@RequestBody User user) {
        return userRepository.save(user);
    }

    // 详细
    @GetMapping("/{id}")
    public User getUser(@PathVariable String id) {
        return userRepository.findById(id).orElse(null);
    }

    // 删除
    @DeleteMapping("/{id}")
    public void deleteUser(@PathVariable String id) {
        userRepository.deleteById(id);
    }

    // 修改
    @PutMapping("/{id}")
    public User updateUser(@PathVariable String id, @RequestBody User user) {
        User userFromDb = userRepository.findById(id).orElse(null);
        if (userFromDb != null) {
            userFromDb.setName(user.getName());
            userFromDb.setAge(user.getAge());
            return userRepository.save(userFromDb);
        }
        return null;
    }

    // 列表
    @GetMapping
    public Iterable<User> getAllUsers() {
        return userRepository.findAll();
    }
}

进阶篇

使用 MongoDB 的高级特性

索引

索引就像一本目录,帮助 MongoDB 快速找到你想要的数据。你可以使用 @Indexed 注解在实体类中定义索引,或者使用 MongoTemplate 创建索引。

import lombok.Data;
import org.springframework.data.mongodb.core.index.Indexed;

@Data
@Document(collection = "users")
public class User {

    @Id
    private String id;
    
    @Indexed(unique = true)
    private String name; // 定义唯一索引
    
    private int age;

}
聚合操作

聚合操作可以对数据进行分组、统计、排序等操作,例如:

/**
     * 查询年龄等于指定值的文档数量
     */
    @GetMapping("/count-by-age")
    public AggregationResults<demoVo> countByAge(@RequestParam int age) {
        // 创建匹配操作,用于筛选年龄等于指定值的文档
        MatchOperation match = Aggregation.match(Criteria.where("age").is(age));

        // 创建分组操作,按年龄分组并计算每个年龄的文档数量
        GroupOperation group = Aggregation.group("age").count().as("count");

        // 创建投影操作,将分组后的结果中的计数值重命名为"count",并保留原始的"_id"字段(即年龄)
        ProjectionOperation project = Aggregation.project("count").and("_id").as("age");

        // 创建聚合管道,将匹配、分组和投影操作组合在一起
        Aggregation aggregation = Aggregation.newAggregation(match, group, project);

        // 使用MongoTemplate执行聚合操作,并将结果映射到demoVo类
        return mongoTemplate.aggregate(aggregation, "users", demoVo.class);
    }
事务

MongoDB 支持事务,你可以使用 MongoTransactionManager 进行事务管理,保证数据的一致性。

总结

SpringBoot 与 MongoDB 的结合,为开发者提供了强大的工具,可以快速构建高效、灵活的应用。希望这篇文章能够帮助你入门 MongoDB,并将其应用到你的项目中。

;