Spring Boot 与 MongoDB:创建带过期时间的集合

在现代应用程序中,数据存储和管理的策略变得越来越重要。尤其是在需要存储大量临时或过期数据的场景中,MongoDB 的集合过期时间功能显得尤为强大。本文将介绍如何使用 Spring Boot 与 MongoDB 创建一个集合并设置过期时间,并提供相关的代码示例和序列图。

什么是集合过期时间?

MongoDB 提供了一种叫做 TTL(时间生存)索引的机制,可以自动删除不再需要的文档。通过 TTL 索引,开发者可以为集合中的文档设置一个过期时间,MongoDB 会根据该时间自动清除这些文档。这对于临时数据存储、会话管理等场景非常有用。

创建 Spring Boot 项目

首先,我们需要创建一个 Spring Boot 项目。您可以使用 Spring Initializr 快速创建一个新的项目。在创建过程中,确保选择以下依赖:

  • Spring Web
  • Spring Data MongoDB

创建完项目后,您将拥有一个基本的 Spring Boot 项目结构。

配置 MongoDB

确保您已经安装并运行了 MongoDB。在 application.properties 文件中,配置 MongoDB 的连接信息:

spring.data.mongodb.uri=mongodb://localhost:27017/test

这里 test 是数据库的名称。

定义文档模型

我们将创建一个 User 类,用于表示我们在数据库中存储的用户信息。我们还将为其定义一个过期时间字段,例如 createdAt

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

import java.time.LocalDateTime;

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

    @Id
    private String id;

    private String name;

    @Indexed(expireAfterSeconds = 3600) // 过期时间(秒)
    private LocalDateTime createdAt;

    // Constructors, getters and setters
    public User(String name) {
        this.name = name;
        this.createdAt = LocalDateTime.now();
    }

    // Getters and setters...
}

在上面的代码中,@Indexed(expireAfterSeconds = 3600) 注解设置用户文档在创建后 3600 秒(1 小时)后过期。

创建用户存储服务

接下来,我们需要创建一个服务来管理用户的存储与检索。我们将使用 MongoRepository 接口来简化数据操作。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public User createUser(String name) {
        User user = new User(name);
        return userRepository.save(user);
    }

    public List<User> getUsers() {
        return userRepository.findAll();
    }
}

创建控制器

然后,我们创建一个控制器来提供 RESTful API,用于创建和获取用户信息。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

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

    @Autowired
    private UserService userService;

    @PostMapping
    public User createUser(@RequestParam String name) {
        return userService.createUser(name);
    }

    @GetMapping
    public List<User> getUsers() {
        return userService.getUsers();
    }
}

启动应用并测试

启动 Spring Boot 应用程序后,可以使用 Postman 或 curl 命令来测试 API。

创建用户:

curl -X POST "http://localhost:8080/api/users?name=JohnDoe"

获取用户列表:

curl -X GET "http://localhost:8080/api/users"

过期时间的工作过程

在文档 createdAt 时间达到设定的过期时间后,MongoDB 将自动删除这些文档。该过程是异步的,通常在每隔 60 秒左右清查过期文档一次。

以下是表示过期时间处理的序列图:

sequenceDiagram
    participant User
    participant MongoDB
    User->>MongoDB: 创建User文档
    MongoDB-->>User: 返回文档ID
    Note right of User: 文档包含创建时间
    MongoDB->>MongoDB: 监测文档过期
    Note right of MongoDB: 到达过期时间后
    MongoDB-->>MongoDB: 自动删除文档

总结

通过使用 Spring Boot 和 MongoDB 的 TTL 索引,我们能够轻松地创建带有过期时间的集合。这种机制有效地帮助我们管理临时数据,节省存储空间,并保证数据的新鲜度。希望本文能帮助您掌握使用 Spring Boot 和 MongoDB 创建过期集合的技巧,提升您在项目中的数据管理能力。