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

推荐订阅源

Google DeepMind News
Google DeepMind News
F
Fortinet All Blogs
量子位
G
Google Developers Blog
J
Java Code Geeks
N
Netflix TechBlog - Medium
博客园 - 聂微东
宝玉的分享
宝玉的分享
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
月光博客
月光博客
The Cloudflare Blog
Apple Machine Learning Research
Apple Machine Learning Research
爱范儿
爱范儿
雷峰网
雷峰网
M
MIT News - Artificial intelligence
T
Tailwind CSS Blog
V
Visual Studio Blog
阮一峰的网络日志
阮一峰的网络日志
博客园 - 三生石上(FineUI控件)
Microsoft Azure Blog
Microsoft Azure Blog
aimingoo的专栏
aimingoo的专栏
Martin Fowler
Martin Fowler
有赞技术团队
有赞技术团队
T
The Blog of Author Tim Ferriss

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