Spring Boot整合MongoDB按packageHolidayType过滤查询集合文档
你的过滤查询方案完全可行,基于Spring Boot + Spring Data MongoDB可以快速实现需求,具体实现步骤如下:
前置依赖准备
确保项目已经引入Web和MongoDB的官方Starter依赖,Maven配置示例:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
同时在项目配置文件中完成MongoDB连接地址、对应数据库名的配置即可。
1. 定义集合对应的实体类
创建和packageholiday集合映射的实体类:
import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import java.util.List; @Document(collection = "packageholiday") public class PackageHoliday { @Id private String id; private List<String> packageHolidayType; // 省略其他业务字段、getter/setter方法 }
2. 实现数据访问层
创建Repository接口继承MongoRepository,利用Spring Data的方法名派生查询能力,不需要手写MongoDB查询语句:
import org.springframework.data.mongodb.repository.MongoRepository; import java.util.List; public interface PackageHolidayRepository extends MongoRepository<PackageHoliday, String> { // 自动生成查询:匹配packageHolidayType数组中包含指定type值的所有文档 List<PackageHoliday> findByPackageHolidayTypeContaining(String type); }
说明:针对数组类型字段,
Containing关键字会被自动翻译为MongoDB原生的数组包含匹配语法,和手写{ packageHolidayType: "目标值" }的原生查询效果完全一致,没有额外性能开销。
3. 实现REST接口
编写Controller层,暴露你需要的两个GET接口:
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.List; @RestController public class TourController { @Resource private PackageHolidayRepository packageHolidayRepository; @GetMapping("/getEscortedTours") public List<PackageHoliday> getEscortedTours() { return packageHolidayRepository.findByPackageHolidayTypeContaining("escortedTours"); } @GetMapping("/getIndepedentTours") public List<PackageHoliday> getIndepedentTours() { return packageHolidayRepository.findByPackageHolidayTypeContaining("indepedentTours"); } }
方案验证说明
- 这个实现完全匹配你的需求:
packageHolidayType是数组字段时,上述查询只会返回数组中包含对应类型值的文档,不会出现漏查、错查问题。 - 如果集合数据量较大,可以给
packageHolidayType字段创建普通索引,能大幅提升查询速度。 - 后续如果新增度假类型,不需要修改Repository层代码,直接复用现有查询方法即可,也可以按需把两个接口合并为带类型参数的单接口,减少重复代码。
内容的提问来源于stack exchange,提问作者devnoob
相关产品推荐
相关产品推荐

