使用Spring Data MongoDB中的MongoTemplate实现分组查询最新的数据
假设我们的mongoDB
数据库中有一个集合名为stents
的集合,我们想查询出每个支架号对应的最新的一条数据,即有多少个支架就会有对应多少条最新的支架数据。
我们使用Spring Data MongoDB中的MongoTemplate
来查询所有支架的最新数据,可以通过构建一个聚合查询来实现。这里假设您的集合名为stents
,每个支架有唯一的stentId
,并且每条记录都有一个表示创建时间的createdAt
字段。
以下是使用MongoTemplate
实现这一功能的Java代码示例:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.*;
import org.springframework.stereotype.Service;
import org.springframework.data.domain.Sort.Direction;
import java.util.List;
@Service
public class StentDataService {
@Autowired
private MongoTemplate mongoTemplate;
public List<Document> findLatestStentData() {
// 定义分组键
GroupOperation groupOperation = Aggregation.group("stentId")
.first("$$ROOT").as("latestData")
.max("createdAt").as("latestDate");
// 定义投影操作,重新组织输出结构
ProjectionOperation projectionOperation = Aggregation.project("latestData")
.andExpression("_id").as("no")
.andExpression("latestData.height").as("height")
.andExpression("latestData.tuiLiuXC").as("tuiLiuXC")
.andExpression("latestData.liZhuYL").as("liZhuYL")
.andExpression("latestData.actions").as("actions")
.andExpression("latestData.createTime").as("createTime")
.andExclude("_id");
// 构建排序操作,虽然在这个例子中可能不需要显式排序,因为聚合框架会在分组时自然地处理最大值问题
SortOperation sortOperation = Aggregation.sort(Direction.DESC, "latestDate");
// 创建聚合操作
Aggregation aggregation = Aggregation.newAggregation(
groupOperation,
projectionOperation,
sortOperation
);
// 执行聚合查询
AggregationResults<Document> results = mongoTemplate.aggregate(aggregation, "stents", Document.class);
// 返回结果
return results.getMappedResults();
}
}
解释
-
定义分组操作 (
GroupOperation
):- 使用
Aggregation.group("stentId")
按stentId
分组。 - 使用
.first("$$ROOT").as("latestData")
保存每个分组中的第一条记录(即最新的记录)。 - 使用
.max("createdAt").as("latestDate")
保存每个分组中的最大createdAt
值,以确保分组操作正确识别最新的记录。
- 使用
-
定义投影操作 (
ProjectionOperation
):- 使用
Aggregation.project("latestData")
重新组织输出结构,使每个结果包含latestData
字段。 - 使用
.andExpression("_id").as("stentId")
将分组键_id
重命名为stentId
。 - 使用
.andExclude("_id")
排除原始的_id
字段,以避免混淆。
- 使用
-
定义排序操作 (
SortOperation
):- 虽然在这个例子中可能不需要显式排序,但为了完整性,可以添加一个按
latestDate
降序排列的操作。
- 虽然在这个例子中可能不需要显式排序,但为了完整性,可以添加一个按
-
创建聚合操作 (
Aggregation
):- 使用
Aggregation.newAggregation()
方法组合所有的聚合阶段。
- 使用
-
执行聚合查询:
- 使用
mongoTemplate.aggregate()
方法执行聚合查询,并指定集合名和结果类型。 results.getMappedResults()
返回聚合查询的结果列表。
- 使用
注意事项
- 确保您的Spring Boot项目已经配置了
MongoTemplate
,并且MongoDB连接配置正确。 - 替换
"stents"
为您实际的集合名称。 - 如果您的文档结构不同,可能需要调整字段名称和聚合操作。
通过这种方式,您可以有效地查询所有支架的最新数据。