MongoDB 8.0——时间序列
时间序列1、时间序列介绍2、创建和查询时间序列集合2.1、创建时间序列集合2.2、在时间序列集合中插入测量值2.3、查询时间序列集合2.4、在时间序列集合上运行聚合3、列出数据库中的时间序列集合4、设置时间序列集合的自动删除5、设置时间序列数据的粒度6、向时间序列集合添加从节点索引6.1、创建二级索引6.2、使用二级索引提高排序性能6.3、时间序列集合的最新数据点查询MongoDB数据库支持时间序列数据的存储和管理通过其时间序列集合(Time Series Collections)功能可以有效地存储一段时间内的测量序列。1、时间序列介绍MongoDB数据库的时间序列集合是一种特殊类型的集合设计用于存储时间序列数据。这种数据类型由一系列数据点组成每个数据点都包含一个时间戳和相关的测量值通过分析这些随时间变化的数据点可以获得对数据的深刻理解。时间序列数据通常由以下几个部分组成。时间数据点被记录的时间。元数据一个标签或标记唯一标识一个序列并且很少更改。测量值按时间增量跟踪的数据点通常是随时间变化的键–值对。在MongoDB数据库中使用时间序列集合首先需要创建集合。在创建过程中包括指定时间字段(timeField)和可选的元数据字段(metaField)。时间字段必须具有BSON类型日期而元数据字段用于标记一系列独一无二的文档数据。创建集合后可以插入数据每个数据点都包含时间戳和相应的测量值。MongoDB的时间序列集合功能为存储和分析时间序列数据提供了强大的支持适用于需要追踪随时间变化的数据点的各种应用场景。例如物联网(Internet of ThingsIoT)数据、天气传感器读数、金融市场的价格波动具体见表。总之MongoDB数据库提供的时间序列集合实现了高效率的时间序列数据存储。2、创建和查询时间序列集合在使用时间序列集合时需要注意由于MongoDB数据库版本的兼容性设计人员只能在FeatureCompatibilityVersion设置为5.0或更高版本的系统上创建时间序列集合。2.1、创建时间序列集合MongoDB使用db.createCollection()方法或create命令创建集合具体代码如下db.createCollection(weather,{timeseries:{timeField:timestamp,metaField:metadata}})上面的代码将timeField字段设置为包含时间数据的字段将metaField字段设置为包含元数据的字段。创建时间序列集合后设计人员可以使用collMod方法修改时间序列粒度或存储桶定义。但是设计人员只能增加每个存储桶涵盖的时间跨度却无法减少。可以通过定义一个granularity字段来实现具体代码如下timeseries:{timeField:timestamp,metaField:metadata,granularity:seconds}在MongoDB 6.3及更高版本中设计人员可以定义bucketMaxSpanSeconds和bucketRoundingSeconds字段且这两个字段的值必须相同具体代码如下timeseries:{timeField:timestamp,metaField:metadata,bucketMaxSpanSeconds:300,bucketRoundingSeconds:300}还有一种可选的方式即设置expireAfterSeconds字段使文档在timeField的值达到该值时以及达到该值之后均过期。timeseries:{timeField:timestamp,metaField:metadata,granularity:seconds},expireAgterSeconds:864002.2、在时间序列集合中插入测量值在MongoDB中设计人员插入的每个文档都应包含一个测量值。例如要同时插入多个天气测量值文档可以执行以下命令db.weather.insertMany([{metadata:{sensorId:6688,type:temperature},timestamp:ISODate(2024-08-18T00:00:00.000Z),temp:12},{metadata:{sensorId:6688,type:temperature},timestamp:ISODate(2024-08-18T08:00:00.000Z),temp:11},{metadata:{sensorId:6688,type:temperature},timestamp:ISODate(2024-08-18T16:00:00.000Z),temp:16},{metadata:{sensorId:6688,type:temperature},timestamp:ISODate(2024-08-18T20:00:00.000Z),temp:15},{metadata:{sensorId:6688,type:temperature},timestamp:ISODate(2024-08-19T08:00:00.000Z),temp:11},{metadata:{sensorId:6688,type:temperature},timestamp:ISODate(2024-08-19T16:00:00.000Z),temp:17},{metadata:{sensorId:6688,type:temperature},timestamp:ISODate(2024-08-19T20:00:00.000Z),temp:12},])如果要插入单个文档设计人员可以使用db.weather.insertOne()方法进行操作。2.3、查询时间序列集合在MongoDB中查询时间序列集合的方式与查询标准MongoDB集合的方式相同。例如要从时间序列集合中返回一个文档可以执行以下命令db.weather.findOne({timestamp:ISODate(2024-08-18T00:00:00.000Z)})输出结果如下{timestamp:ISODate(2024-08-18T00:00:00.000Z),metadata:{sensorId:6688,type:temperature},temp:12,_id:ObjectId(6a6f38642b32e82d9d5fc6fb)}2.4、在时间序列集合上运行聚合在MongoDB中设计人员要获得其他更多的查询功能可以使用聚合管道。例如可以执行以下命令db.weather.aggregate([{$project:{date:{$dateToParts:{date:$timestamp}},temp:1}},{$group:{_id:{date:{year:$date.year,month:$date.month,day:$date.day}},avgTmp:{$avg:$temp}}}])输出结果如下[{_id:{date:{year:2024,month:8,day:18}},avgTmp:13.5},{_id:{date:{year:2024,month:8,day:19}},avgTmp:13.333333333333334}]3、列出数据库中的时间序列集合MongoDB数据库可以输出数据库中的集合列表并按各种属性包括集合类型筛选结果设计人员可以使用此功能列出数据库中的所有时间序列集合。首先要列出数据库中的所有时间序列集合请使用带有{type: “timeseries”}过滤器的listCollections命令具体代码如下db.runCommand({listCollections:1,filter:{type:timeseries}})上面的代码会输出对应时间序列的集合具体包括如下选项type: ‘timeseries’。options: { timeseries: { … } }。输出结果如下{cursor:{id:Long(0),ns:test.$cmd.listCollections,firstBatch:[{name:weather,type:timeseries,options:{timeseries:{timeField:timestamp,metaField:metadata,granularity:seconds,bucketMaxSpanSeconds:3600}},info:{readOnly:false}}]},ok:1}4、设置时间序列集合的自动删除MongoDB数据库在创建天气测量值时间序列集合时可以使用expireAfterSeconds参数设置自动删除超过指定秒数的文档具体代码如下db.createCollection(weather,{timeseries:{timeField:timestamp,metaField:metadata,granularity:hours},expireAfterSeconds:86400})在上面的代码中过期阈值为timeField字段值加上指定的秒数。例如考虑天气测量值时间序列集合中的以下文档{metadata:{sensorId:6688,type:temperature}timestamp:ISODate(2024-08-18T00:00:00.000Z),temp:12}上面的文档将于2024-08-18T00:00:00.000Z时间后在数据库中过期一旦存储桶中的所有文档都过期删除过期存储桶的后台任务就会在下一次运行期间删除该存储桶。设计人员如果要在集合中启用自动删除现有时间序列集合的文档可以使用以下collMod命令db.runCommand({collMod:weather,expireAfterSeconds:604801})设计人员如果要更改expireAfterSeconds参数值也可以发出以下相同的collMod命令db.runCommand({collMod:weather,expireAgterSeconds:604801})设计人员如果要检索expireAfterSeconds的当前值可以使用listCollections命令db.runCommand({listCollections:1})结果文档包含时间序列集合的文档其中包含options.expireAfterSeconds字段设计人员如果要禁用自动删除可以使用collMod命令将expireAfterSeconds参数设置为off具体代码如下db.runCommand({collMod:weather,expireAfterSeconds:off})MongoDB数据库不保证过期数据会在过期后立即删除一旦一个存储桶中的所有文档都过期删除过期存储桶的后台任务就会在下一次运行期间删除该存储桶。5、设置时间序列数据的粒度MongoDB数据库创建时间序列集合时会自动创建一个system.buckets系统集合并将输入的时间序列数据分组到存储桶中。通过设置粒度设计人员可以根据数据的引入速率控制对数据进行存储分段的频率。如果要检索当前集合分桶参数可以使用listCollections命令具体代码如下db.runCommand({listCollections:1})对于时间序列集合上面的代码会输出包含granularity、bucketMaxSpanSeconds和bucketRoundingSeconds的参数具体结果如下如果使用给定的granularity参数值一个数据存储桶中包含的最长时间限额为seconds1小时。minutes24小时。hours30天。默认情况下granularity参数设置为seconds。可以将granularity值设置为最接近同一数据源传入测量值之间的时间跨度从而提高性能。例如若要记录来自数千个传感器的天气数据但每5分钟仅记录一次来自每个传感器的数据则可将granularity参数设置为minutes具体代码如下如果将granularity参数设置为hours则会将长达一个月的数据导入事件分组到单个存储桶中从而拖延遍历时间并减慢查询速度。将其设置为seconds会导致每个轮询间隔有多个存储桶其中许多存储桶可能只包含一个文档。设计人员可以使用collMod命令将timeseries.granularity从较短的时间单位增加到较长的时间单位从而更改时间序列粒度。具体代码如下想要更新自定义分桶参数bucketRoundingSeconds和bucketMaxSpanSeconds不是granularity参数​请将这两个自定义参数包含在collMod命令中并将它们设置为相同的值具体代码如下6、向时间序列集合添加从节点索引MongoDB数据库要提高时间序列集合的查询性能可添加一个或多个二级索引以支持常见的时间序列查询模式。6.1、创建二级索引从MongoDB 6.3版本开始MongoDB会自动在metaField和timeField字段上为新集合创建复合索引。设计人员如何创建额外的二级索引呢下面使用具有特定配置的天气数据集合作为示例具体代码如下db.createCollection(weather,{timeseries:{timeField:timestamp,metaField:metadata}})在每个天气数据文档中metadata字段值是一个子文档其中包含天气传感器ID和类型的字段具体输出如下文档集合的默认复合索引会对整个metadata子文档进行索引因此该索引仅用于$eq查询。通过对特定的metadata字段建立索引设计人员可以提高其他查询类型的查询性能。例如$in查询性能就能受益于metadata.type的二级索引具体如下{metadata.type:{$in:[temperature,pressure]}}6.2、使用二级索引提高排序性能MongoDB数据库对时间序列集合的排序操作可以在timeField字段上使用二级索引。在某些条件下排序操作还可以在metaField和timeField字段上使用复合二级索引。聚合管道阶段$match和$sort决定了时间序列集合可以使用哪些索引具体可以用于以下场景{timeField:±1}上的排序使用timeField上的二级索引。对{metaField:±1, timeField: ±1}的排序会在{metaField: ±1, timeField: ±1}上使用默认复合索引。在metaField上具有点谓词时对{timeField:±1}的排序使用{metaField: ±1,timeField: ±1}上的复合二级索引。下面来看一个示例sensorData集合包含来自天气传感器的测量值具体代码如下如果想在timestamp字段上创建二级单字段索引具体代码如下db.sensorData.createIndex({timestamp:1})以下对timestamp字段的排序操作使用二级索引来提高性能具体代码如下想要确认排序操作使用了二级索引请使用.explain(“executionStats”)选项再次运行该操作具体代码如下6.3、时间序列集合的最新数据点查询MongoDB数据库中针对时间序列数据的最新数据点查询会返回给定字段具有最新时间戳的数据点。对于时间序列集合最新数据点查询会获取每个唯一元数据值的最新测量值。例如设计人员可能想要获取所有传感器的最新温度读数可以通过创建以下任意一个索引来提升最新数据点查询的性能。具体代码如下{metadata.sensorId:1,timestamp:1}{metadata.sensorId:1,timestamp:-1}{metadata.sensorId:-1,timestamp:1}{metadata.sensorId:-1,timestamp:-1}下面的命令用于创建一个复合二级索引metaField参数上的索引为升序timeField参数上的索引为降序。db.sensorData.createIndex({metadata.sensorId:1,timestamp:-1})下面的命令展示了最新数据点查询的示例使用了前文中降序timeField参数的复合二级索引。想要确认最新数据点查询是否使用了二级索引可使用.explain(“executionStats”)命令再次运行该操作

相关新闻

一行注解搞定权限和审计:注解式 RBAC 的工程实践

一行注解搞定权限和审计:注解式 RBAC 的工程实践

这是背单词小程序「优词记 Pro」技术复盘的收尾篇。前六篇聊了架构、路由、代码生成、SQL 重构和构建踩坑,今天讲后台管理里最容易写脏的两个横切关注点——权限控制和操作日志——以及怎么用注解把它们变成「加一行声明」的事。问题:权限逻辑怎么放都别…

2026/9/24 7:49:05 阅读更多 →
session文件包含详解 加ctf实战练习

session文件包含详解 加ctf实战练习

大家可以 在自己的靶场中导入代码先自己试一下 具体代码在文章中 了解session 可以先根据尝试包含到SESSION文件,在根据文件内容寻找可控变量,在构造payload插入到文件中,最后包含即可。 利用条件: 找到Session内的可控变量 …

2026/9/11 22:16:20 阅读更多 →
MyBatis TypeHandler原理与LocalDateTime转换实战

MyBatis TypeHandler原理与LocalDateTime转换实战

1. TypeHandler类型转换器概述在持久层框架中,TypeHandler(类型处理器)是处理Java类型与数据库类型之间转换的核心组件。当我们在MyBatis等ORM框架中遇到字段类型不匹配的情况时,TypeHandler能够自动完成双向的类型转换工作。比如…

2026/9/19 15:32:17 阅读更多 →

最新新闻

Claude Code命令速查大全:TaoToken统一Key接入CLI斜杠命令与快捷键配置

Claude Code命令速查大全:TaoToken统一Key接入CLI斜杠命令与快捷键配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 13:16:43 阅读更多 →
为什么AI算力集群这么烧钱?Flex:ai解决大模型与小模型混部场景的GPU浪费难题

为什么AI算力集群这么烧钱?Flex:ai解决大模型与小模型混部场景的GPU浪费难题

为什么AI算力集群这么烧钱?Flex:ai解决大模型与小模型混部场景的GPU浪费难题 【免费下载链接】flexai Flex:ai是一个面向AI容器场景的开源项目,其核心能力包含两大部分,分别是XPU虚拟化和多级智能调度。其中XPU虚拟化分为本地XPU虚拟化和跨节…

2026/9/25 13:16:43 阅读更多 →
@voltagent/mcp-server 全解析:用 Model Context Protocol 暴露 VoltAgent Agent、工作流与工具

@voltagent/mcp-server 全解析:用 Model Context Protocol 暴露 VoltAgent Agent、工作流与工具

人工智能AI AgentAgent 框架后端多智能体RAG工具调用Agent 记忆 【免费下载链接】voltagent AI Agent Engineering Platform built on an Open Source TypeScript AI Agent Framework 项目地址: https://gitcode.com/gh_mirrors/vo/voltagent 点击查看 免费下载 导…

2026/9/25 13:16:43 阅读更多 →
养殖龙虾(OpenClaw)必配的虾粮与工具:TaoToken 统一 Key 接入 Gateway 配置清单

养殖龙虾(OpenClaw)必配的虾粮与工具:TaoToken 统一 Key 接入 Gateway 配置清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 13:16:43 阅读更多 →
Tekton Pipeline Cluster Resolver 实战指南:解析集群内 Task、Pipeline 与 StepAction 并理解其缓存与安全边界

Tekton Pipeline Cluster Resolver 实战指南:解析集群内 Task、Pipeline 与 StepAction 并理解其缓存与安全边界

云原生CI/CDDevOps后端 【免费下载链接】pipeline A cloud-native Pipeline resource. 项目地址: https://gitcode.com/gh_mirrors/pipelin/pipeline 点击查看 免费下载 本文聚焦 Tekton Pipeline(pipelin/pipeline 仓库)的 Cluster Resolve…

2026/9/25 13:16:42 阅读更多 →
PaddleSeg PanopticSeg 全景分割工具箱快速上手:预训练模型推理、训练与评估实战指南

PaddleSeg PanopticSeg 全景分割工具箱快速上手:预训练模型推理、训练与评估实战指南

人工智能计算机视觉预训练 【免费下载链接】PaddleSeg Easy-to-use image segmentation library with awesome pre-trained model zoo, supporting wide-range of practical tasks in Semantic Segmentation, Interactive Segmentation, Panoptic Segmentation, Image Matting,…

2026/9/25 13:15:42 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →