惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

阮一峰的网络日志
阮一峰的网络日志
Apple Machine Learning Research
Apple Machine Learning Research
量子位
D
DataBreaches.Net
云风的 BLOG
云风的 BLOG
博客园 - 聂微东
博客园_首页
D
Docker
博客园 - 叶小钗
S
SegmentFault 最新的问题
大猫的无限游戏
大猫的无限游戏
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
J
Java Code Geeks
H
Hackread – Cybersecurity News, Data Breaches, AI and More
A
About on SuperTechFans
博客园 - 三生石上(FineUI控件)
F
Fortinet All Blogs
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
爱范儿
爱范儿
腾讯CDC
罗磊的独立博客
雷峰网
雷峰网
博客园 - Franky

博客园 - zakun

适配 WSL 的 proxy 完整脚本 Gitlab CI 本地开发部署 Golang grpc 实践 真・一键激活 JetBrains 全家桶! Kafka 分区细说 解决国内Homebrew安装 Homebrew How to Install PHP Install Elasticsearch with Docke wsl2 网络相关设置 php docker image nginx 反向代理常用设置说明 Golang常见的并发模式 Gin框架的几种热加载方法 协程 Mysql Full-Text Index 介绍 gitlab runner 使用摘要 Gitlab Docker 使用摘要 Docker 简介 linux-查看文件夹大小 Linux 如何删除乱码文件-inode删除 Nginx反爬虫: 禁止某些User Agent抓取网站 PHP添加$_SERVER服务器环境变量
Mongo 聚合演示
zakun · 2026-02-10 · via 博客园 - zakun

Mongo 聚合演示

你想要在 MongoDB 中统计指定时间范围 [t1, t2] 内,每辆车(按 sn 字段)的最新一条行程记录,我会为你提供精准的聚合查询语句。
参考链接:https://geek-docs.com/mongodb/mongodb-top-articles/1018100_mongodb_aggregation.html

实现思路

要实现这个需求,核心是通过 MongoDB 的聚合管道完成以下步骤:

  • 筛选出时间范围在 [t1, t2] 内的行程记录
  • 按车序列号 sn 分组
  • 在每个分组内按开始时间 start_time 降序排序,取第一条(最新)记录
  • 还原完整的行程记录字段

完整查询语句


// 定义时间范围(请替换为你实际的时间值)
const t1 = new Date("2026-01-01T00:00:00.000Z"); // 开始时间
const t2 = new Date("2026-01-31T23:59:59.999Z"); // 结束时间

// 聚合查询语句
db.riding_records.aggregate([
  // 第一步:筛选时间范围内的记录
  {
    $match: {
      start_time: {
        $gte: t1,    // 大于等于开始时间t1
        $lte: t2     // 小于等于结束时间t2
      }
    }
  },
  // 第二步:按车序列号分组,保留每组最新的记录
  {
    $group: {
      _id: "$sn",                // 按sn分组
      latestRecord: { $first: "$$ROOT" }  // 保留排序后的第一条(最新)记录
    }
  },
  // 第三步:按开始时间降序排序(确保每组第一条是最新的)
  {
    $sort: { "latestRecord.start_time": -1 }
  },
  // 第四步:还原记录结构(可选,让输出更整洁)
  {
    $replaceRoot: { newRoot: "$latestRecord" }
  }
]);

关键部分解释

  • $match 阶段:精准筛选出 start_time 在 [t1, t2] 范围内的行程记录,减少后续计算量。
  • $group 阶段:
    • _id: "$sn":按车序列号分组,确保每个 sn 只保留一条记录
    • $first: "$$ROOT":$$ROOT 代表整条文档,$first 取分组内排序后的第一条记录
  • sort 阶段
    • 按 start_time 降序排列,保证$first取到的是最新记录
  • $replaceRoot 阶段:将嵌套的 latestRecord 提升为根文档,输出结构和原文档一致