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

推荐订阅源

B
Blog RSS Feed
博客园 - 叶小钗
F
Fortinet All Blogs
GbyAI
GbyAI
Martin Fowler
Martin Fowler
博客园 - 聂微东
I
InfoQ
B
Blog
IT之家
IT之家
美团技术团队
L
LangChain Blog
小众软件
小众软件
C
Check Point Blog
MongoDB | Blog
MongoDB | Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V
V2EX
Last Week in AI
Last Week in AI
A
About on SuperTechFans
博客园 - Franky
P
Proofpoint News Feed
罗磊的独立博客
月光博客
月光博客
V
Visual Studio Blog
MyScale Blog
MyScale Blog

博客园 - 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 提升为根文档,输出结构和原文档一致