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

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

解释

  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.kler.cn/a/417965.html

相关文章:

  • 基于PHP的香水销售系统的设计与实现
  • 蓝队基础(泷羽sec)
  • 本地学习axios源码-如何在本地打印axios里面的信息
  • 架构师:Dubbo 服务请求失败处理的实践指南
  • shell语法(1)bash
  • 华为机试HJ77 火车进站
  • 设计模式---建造者模式
  • 迅为RK3588开发板Android12源码定制开发-安装adb驱动
  • 飙升Vue.js组件开发
  • Flutter 1.1:下载Flutter环境
  • 一个鸿蒙开发者的探索:实现相册访问功能
  • Python+Pytest+Yaml+Allure数据参数化(DDT)数据驱动(一)
  • 前端css实例
  • 【04】Selenium+Python 手动添加Cookie免登录(实例)
  • 何时在 SQL 中使用 CHAR、VARCHAR 和 VARCHAR(MAX)
  • Golang context 的作用和实现原理
  • 7. 现代卷积神经网络
  • 【051】基于51单片机温度计【Proteus仿真+Keil程序+报告+原理图】
  • uni-app获取到的数据如何保留两位小数
  • JavaWeb开发 : tomcat+Servlet+JSP
  • Mac苹果电脑 java前后端开发环境及软件安装教程
  • 算法编程题-煎饼排序 不含AAA或者BBB的字符串
  • Jtti:排查和解决服务器死机问题的步骤
  • LangChain——HTML文本分割 多种文本分割
  • Ubuntu20.04运行LARVIO
  • springboot347基于web的铁路订票管理系统(论文+源码)_kaic