当前位置: 首页 > news >正文

使用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 {@Autowiredprivate 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();}
}

解释

  1. 定义分组操作 (GroupOperation):

    • 使用Aggregation.group("stentId")stentId分组。
    • 使用.first("$$ROOT").as("latestData")保存每个分组中的第一条记录(即最新的记录)。
    • 使用.max("createdAt").as("latestDate")保存每个分组中的最大createdAt值,以确保分组操作正确识别最新的记录。
  2. 定义投影操作 (ProjectionOperation):

    • 使用Aggregation.project("latestData")重新组织输出结构,使每个结果包含latestData字段。
    • 使用.andExpression("_id").as("stentId")将分组键_id重命名为stentId
    • 使用.andExclude("_id")排除原始的_id字段,以避免混淆。
  3. 定义排序操作 (SortOperation):

    • 虽然在这个例子中可能不需要显式排序,但为了完整性,可以添加一个按latestDate降序排列的操作。
  4. 创建聚合操作 (Aggregation):

    • 使用Aggregation.newAggregation()方法组合所有的聚合阶段。
  5. 执行聚合查询

    • 使用mongoTemplate.aggregate()方法执行聚合查询,并指定集合名和结果类型。
    • results.getMappedResults()返回聚合查询的结果列表。

注意事项

  • 确保您的Spring Boot项目已经配置了MongoTemplate,并且MongoDB连接配置正确。
  • 替换"stents"为您实际的集合名称。
  • 如果您的文档结构不同,可能需要调整字段名称和聚合操作。

通过这种方式,您可以有效地查询所有支架的最新数据。


http://www.mrgr.cn/news/78401.html

相关文章:

  • 使用 pycharm 新建不使用 python 虚拟环境( venv、conda )的工程
  • 2024 TIP 论文 robust-ref-seg 复现过程
  • 【Petri网导论学习笔记】Petri网导论入门学习(十一) —— 3.3 变迁发生序列与Petri网语言
  • 介绍一下atof(arr);(c基础)
  • 【分布式系统】唯一性ID的实现
  • 详解:服务器虚拟机硬盘挂载
  • 前端应用界面的展示与优化(记录)
  • C++学习日记---第14天(蓝桥杯备赛)
  • 什么是代理,nodenginx前端代理详解
  • vue修改el-table-column上下margin外边距调整行间距方法教程
  • 在Ubuntu2004中搭建基于ESP-IDF v5.1的ESP32-S3开发环境
  • MySQL篇
  • 缓存方案分享
  • Vue 2 安装并使用 Ag-Grid ^31.3.4、样式、中文化、组件设计
  • Java 8新特性详解与实战
  • Pytest使用Jpype调用jar包报错:Windows fatal exception: access violation
  • 【k8s深入理解之 Scheme】全面理解 Scheme 的注册机制、内外部版本、自动转换函数、默认填充函数、Options等机制
  • 力扣hot100-->排序
  • Diving into the STM32 HAL-----I²C笔记
  • 【StarRocks】starrocks 3.2.12 【share-nothing】 多Be集群容器化部署
  • K8s调度器扩展(scheduler)
  • 【NLP 2、机器学习简介】
  • 《Unity Shader 入门精要》高级纹理
  • 44.扫雷第二部分、放置随机的雷,扫雷,炸死或成功 C语言
  • Ubuntu操作
  • tongweb安全整改(by cz)