Spring Boot 與 MongoDB 的集成為開發者提供了一種簡便的方式來構建高性能、基于文檔的數據驅動應用程序。MongoDB 是一個非關系型數據庫(NoSQL),它使用 JSON 格式的文檔進行數據存儲,非常適合處理大量的、半結構化的數據。而 Spring Boot 則通過其自動配置和 Starter 項目簡化了應用開發過程。結合 Spring Data MongoDB,可以非常方便地在 Spring Boot 應用中實現對 MongoDB 的操作,包括復雜的數據聚合查詢。
1. 集成 Spring Boot 與 MongoDB
首先,確保你的開發環境中已經安裝了 MongoDB,并且正在運行。接下來,我們將在 Spring Boot 項目中集成 MongoDB。
添加依賴
在 pom.xml
文件中添加 Spring Boot Starter for MongoDB 的依賴:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>
</dependencies>
配置 MongoDB
在 application.properties
或 application.yml
中配置 MongoDB 的連接信息:
spring:data:mongodb:uri: mongodb://username:password@localhost:27017/databaseName
2. 使用 MongoTemplate 進行聚合查詢
MongoTemplate
是 Spring Data MongoDB 提供的一個主要類,用于執行數據庫操作,包括復雜的聚合查詢。以下是一些基本聚合查詢的示例。
準備工作
假設我們有一個 User
集合,包含用戶的姓名(name)、年齡(age)和注冊日期(registrationDate)字段。
public class User {@Idprivate String id;private String name;private int age;private Date registrationDate;// 省略構造器、getter 和 setter
}
聚合查詢示例
示例 1:計數
計算集合中的文檔總數:
long count = mongoTemplate.count(new Query(), User.class);
示例 2:分組統計
按年齡分組統計用戶數量:
Aggregation agg = Aggregation.newAggregation(Aggregation.group("age").count().as("userCount"));
AggregationResults<Document> results = mongoTemplate.aggregate(agg, "User", Document.class);
results.forEach(result -> System.out.println("Age: " + result.get("age") + ", Count: " + result.get("userCount")));
?
示例 3:匹配與排序
查找年齡大于 25 歲的用戶,并按年齡降序排序:
Aggregation agg = Aggregation.newAggregation(Aggregation.match(Criteria.where("age").gt(25)),Aggregation.sort(Sort.Direction.DESC, "age")
);
List<User> users = mongoTemplate.aggregate(agg, "User", User.class).getMappedResults();
示例 4:投影與限制
只獲取用戶名和年齡,限制結果數量為前 10 條:
Aggregation agg = Aggregation.newAggregation(Aggregation.project("name", "age"),Aggregation.limit(10)
);
List<Document> projectedUsers = mongoTemplate.aggregate(agg, "User", Document.class).getMappedResults();
示例 5:使用管道操作符(更復雜的聚合)
例如,找出每個年齡段的最年輕用戶:
Aggregation agg = Aggregation.newAggregation(Aggregation.group("age").first("name").as("youngestUser").min("registrationDate").as("oldestRegistrationDate"),Aggregation.sort(Sort.Direction.ASC, "_id")
);
AggregationResults<Document> results = mongoTemplate.aggregate(agg, "User", Document.class);
results.forEach(result -> System.out.println(result.toJson()));