创建时间序列集合
您将创建时间序列集合,并指定 timeField、metaField 和粒度选项。
创建时间序列集合 是 CoddyKit 上的免费 MongoDB Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 MongoDB Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 MongoDB Academy 课程共包含 4 节课。
时间序列 Collection 简介
MongoDB 5.0 引入了原生时间序列 collection——这是一种专门的 collection 类型,针对存储和查询随时间变化的测量值进行了优化。常见用例包括IoT 传感器读数、应用指标、金融行情数据和服务器监控数据。与常规 collection 不同,时间序列 collection 在内部使用列式存储格式,可显著减少存储空间,并提升按时间范围筛选时的查询性能。
关键字段:timeField、metaField、granularity
创建时间序列 collection 时,必须设置三个关键选项。timeField 是保存时间戳的文档字段(必须是 BSON Date)。metaField 用于标识序列,例如传感器 ID 或设备名称。granularity 提示('seconds'、'minutes' 或 'hours')用于告知 MongoDB 测量值的到达频率,使其能够在内部优化 bucket 大小。
使用 createCollection 命令创建
使用带有 timeseries 选项对象的 db.createCollection() 创建时间序列 collection。您无法将现有的常规 collection 转换为时间序列 collection,必须重新创建。该 collection 会在 show collections 的结果中显示,并带有特殊的 timeseries 类型指示器。
db.createCollection('sensorReadings', {
timeseries: {
timeField: 'timestamp',
metaField: 'sensorId',
granularity: 'seconds'
}
})Granularity 会影响 Bucket 大小
granularity 选项控制 MongoDB 如何将测量值分组到内部 bucket 文档中。使用 'seconds' 时,每个 bucket 覆盖一小时(每个 bucket 3,600 个测量值);使用 'minutes' 时,每个 bucket 覆盖 24 小时;使用 'hours' 时,每个 bucket 覆盖 30 天。选择错误的 granularity 会导致 bucket 文档增多、压缩效果变差,因此请始终根据实际数据到达速率选择 granularity。
// Sensor sends data every second — use 'seconds'
db.createCollection('iotData', {
timeseries: {
timeField: 'ts',
metaField: 'device',
granularity: 'seconds'
}
})
// Aggregated hourly metric — use 'hours'
db.createCollection('hourlyMetrics', {
timeseries: {
timeField: 'ts',
metaField: 'service',
granularity: 'hours'
}
})时间序列插入的文档结构
插入时间序列 collection 的文档必须包含 timeField,且其值必须是有效的 BSON Date。metaField 值用于标识该测量值所属的序列(例如设备 ID)。其他所有字段都称为测量字段,可以保存任意 BSON 值。如果缺少 timeField 或其值不是 Date,MongoDB 将拒绝该文档。
// Valid time series document
{
timestamp: new Date(), // timeField — must be a Date
sensorId: 'sensor-42', // metaField — identifies the series
temperature: 23.7, // measurement field
humidity: 55.2, // measurement field
pressure: 1013.4 // measurement field
}插入单个和多个测量值
向时间序列 collection 插入数据的方式与常规 collection 完全相同——使用 insertOne() 或 insertMany()。MongoDB 会自动处理内部 bucket。加载历史数据时,最佳实践是使用 insertMany() 批量插入,因为这样可以将创建 bucket 的开销分摊到多个测量值上。
// Insert a single measurement
db.sensorReadings.insertOne({
timestamp: new Date('2024-06-01T10:00:00Z'),
sensorId: 'sensor-42',
temperature: 22.5,
humidity: 60.1
})
// Bulk insert historical data
db.sensorReadings.insertMany([
{ timestamp: new Date('2024-06-01T10:01:00Z'), sensorId: 'sensor-42', temperature: 22.6, humidity: 60.0 },
{ timestamp: new Date('2024-06-01T10:02:00Z'), sensorId: 'sensor-42', temperature: 22.4, humidity: 60.3 }
])使用 expireAfterSeconds 添加自动过期
时间序列 collection 支持通过 expireAfterSeconds 选项自动过期数据。设置该选项后,MongoDB 的后台 TTL 线程会在某个 bucket 中的所有测量值都早于指定阈值时,删除整个 bucket。与常规 TTL 索引相比,这种方式效率更高,因为它一次删除整个内部 bucket 文档,而不是逐个删除测量文档。
// Create with 90-day TTL
db.createCollection('sensorReadings', {
timeseries: {
timeField: 'timestamp',
metaField: 'sensorId',
granularity: 'minutes'
},
expireAfterSeconds: 60 * 60 * 24 * 90 // 90 days
})查询时间序列 Collection
对时间序列 collection 的查询与常规 find() 查询看起来完全相同。按时间范围筛选时,MongoDB 会自动利用内部 bucket 结构跳过不相关的 bucket。按 metaField 筛选同样非常高效。请避免只按测量字段查询而不使用时间或 meta 筛选,因为这会强制扫描所有 bucket 中的整个 collection。
// Query last 24 hours for a specific sensor
const since = new Date(Date.now() - 24 * 60 * 60 * 1000)
db.sensorReadings.find({
sensorId: 'sensor-42',
timestamp: { $gte: since }
}).sort({ timestamp: 1 })创建后更新 Granularity
您可以使用 collMod 命令增大现有时间序列 collection 的 granularity(例如从 'seconds' 改为 'minutes')。但是不能减小 granularity——如果尝试从 'minutes' 改回 'seconds',MongoDB 将返回错误。您也可以通过 collMod 更新 expireAfterSeconds 设置,而无需重新创建 collection。
// Increase granularity from seconds to minutes
db.runCommand({
collMod: 'sensorReadings',
timeseries: { granularity: 'minutes' }
})
// Update expireAfterSeconds to 30 days
db.runCommand({
collMod: 'sensorReadings',
expireAfterSeconds: 60 * 60 * 24 * 30
})限制和约束
与常规 collection 相比,时间序列 collection 有一些重要限制。不能仅基于 timeField 对时间序列 collection 进行分片,必须包含 hashed metaField 组件。更新和删除操作受到限制:在 MongoDB 5.1 之前,只支持按 metaField 或时间范围删除。此外,时间序列 collection 不支持唯一索引、稀疏索引或 capped collection。
验证 Collection 类型和选项
创建时间序列 collection 后,使用 db.getCollectionInfos() 检查它,以确认 timeseries 选项已正确保存。您还可以运行 db.sensorReadings.stats() 查看存储统计信息,其中包括 MongoDB 在后台维护的内部 bucket 文档数量。
// Inspect time series collection metadata
db.getCollectionInfos({ name: 'sensorReadings' })
// Check storage stats
db.sensorReadings.stats()快速检查
测试您对本课中 MongoDB 和 NoSQL 数据库概念的理解。
课程回顾
在本课中,您学习了:时间序列 collection 使用列式 bucket 格式,适合高压缩率、以追加为主的工作负载;三个关键选项(timeField、metaField、granularity)控制测量值的组织方式和 bucket 分组方式;以及 expireAfterSeconds 可在 bucket 级别高效地自动清除旧数据。接下来,我们将深入学习时间序列数据的插入和查询。
用 AI 导师学习 JavaScript — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 30
- 课程
- 120
常见问题解答
「创建时间序列集合」课时是免费的吗?
是的 — 「创建时间序列集合」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 MongoDB Academy 课程的其余内容,请升级到 CoddyKit PRO。 MongoDB Academy 课程共包含 4 节课。
「创建时间序列集合」这节课中我会学到什么?
您将创建时间序列集合,并指定 timeField、metaField 和粒度选项。 你通过在浏览器中直接运行的动手代码来练习 MongoDB Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 MongoDB Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 MongoDB Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「创建时间序列集合」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 MongoDB Academy 课中编写并运行代码吗?
能。每节 MongoDB Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。