本文主要介绍MongoDB数据库的时序数据存储功能,包括时序集合的创建、查询和优化等核心操作。风哥教程参考MongoDB官方文档Time Series Collections相关章节。
目录大纲
Part01-基础概念与理论知识
1.1 时序数据概述
时序数据是指按时间顺序记录的数据,通常具有以下特点:
- 数据按时间顺序生成
- 数据量通常很大
- 查询通常基于时间范围
- 数据写入频率高,读取频率相对较低
常见的时序数据包括传感器数据、监控数据、日志数据等。学习交流加群风哥微信: itpux-com
1.2 MongoDB时序集合特性
MongoDB 5.0及以上版本提供了专门的时序集合(Time Series Collections),具有以下特性:
- 自动数据分区,提高查询性能
- 优化的存储格式,减少存储空间
- 支持高效的时间范围查询
- 自动过期数据,管理数据生命周期
时序集合适用于存储和查询大量的时序数据,如IoT设备数据、监控指标等。更多视频教程www.fgedu.net.cn
Part02-生产环境规划与建议
2.1 时序数据模型设计
时序数据模型设计需要考虑以下因素:
- 时间字段:用于排序和分区
- 元数据字段:用于数据分类和过滤
- 度量字段:实际的测量值
- 数据精度:时间戳的精度
风哥提示:合理的模型设计可以提高查询性能和存储效率。
2.2 存储策略规划
存储策略规划包括:
- 数据保留期限:根据业务需求设置
- 存储压缩:减少存储空间
- 索引策略:优化时间范围查询
- 分区策略:根据时间和元数据分区
更多学习教程公众号风哥教程itpux_com
Part03-生产环境项目实施方案
3.1 时序集合创建
创建时序集合:
# 连接MongoDB
/mongodb/app/bin/mongosh –host 192.168.1.100 –port 27017 -u fgedu -p fgedu123 –authenticationDatabase admin
# 切换到目标数据库
use fgedudb
# 创建时序集合
db.createCollection(“fgedu_sensor_data”, {
timeseries: {
timeField: “timestamp”, // 时间字段
metaField: “metadata”, // 元数据字段
granularity: “seconds” // 时间粒度
}
})
查看集合信息:
# 查看集合信息
db.fgedu_sensor_data.stats()
3.2 数据写入配置
配置数据写入:
# 插入测试数据
for (let i = 0; i < 1000; i++) {
db.fgedu_sensor_data.insertOne({
timestamp: new Date(Date.now() - i * 60000), // 每条记录相差1分钟
metadata: {
sensorId: "sensor-" + (i % 10),
location: "room-" + (i % 5)
},
temperature: 20 + Math.random() * 10,
humidity: 40 + Math.random() * 20,
pressure: 1000 + Math.random() * 20
})
}
Part04-生产案例与实战讲解
4.1 时序数据写入实战
批量写入数据:
# 批量插入数据
const bulk = db.fgedu_sensor_data.initializeUnorderedBulkOp();
for (let i = 0; i < 10000; i++) {
bulk.insert({
timestamp: new Date(Date.now() - i * 1000), // 每条记录相差1秒
metadata: {
sensorId: "sensor-" + (i % 20),
location: "room-" + (i % 10)
},
temperature: 20 + Math.random() * 10,
humidity: 40 + Math.random() * 20,
pressure: 1000 + Math.random() * 20
});
}
bulk.execute();
# 输出日志
BulkWriteResult({
"writeErrors": [],
"writeConcernErrors": [],
"nInserted": 10000,
"nUpserted": 0,
"nMatched": 0,
"nModified": 0,
"nRemoved": 0,
"upserted": []
})
from MongoDB视频:www.itpux.com
4.2 时序数据查询实战
时间范围查询:
# 查询最近1小时的数据
db.fgedu_sensor_data.find({
timestamp: {
$gte: new Date(Date.now() – 60 * 60 * 1000),
$lte: new Date()
}
}).sort({ timestamp: 1 })
# 输出日志
[
{
_id: ObjectId(“60a7b8c9d0e1f2a3b4c5d6e7”),
timestamp: ISODate(“2026-04-08T09:00:00Z”),
metadata: { sensorId: “sensor-1”, location: “room-1” },
temperature: 25.5,
humidity: 55.2,
pressure: 1010.3
},
…
]
按元数据过滤查询:
# 查询特定传感器的数据
db.fgedu_sensor_data.find({
“metadata.sensorId”: “sensor-1”,
timestamp: {
$gte: new Date(Date.now() – 24 * 60 * 60 * 1000)
}
})
聚合查询:
# 按小时统计平均温度
db.fgedu_sensor_data.aggregate([
{
$match: {
timestamp: {
$gte: new Date(Date.now() – 24 * 60 * 60 * 1000)
}
}
},
{
$group: {
_id: {
$dateTrunc: {
date: “$timestamp”,
unit: “hour”
}
},
avgTemperature: { $avg: “$temperature” },
avgHumidity: { $avg: “$humidity” }
}
},
{
$sort: { “_id”: 1 }
}
])
# 输出日志
[
{ “_id”: ISODate(“2026-04-08T08:00:00Z”), “avgTemperature”: 23.5, “avgHumidity”: 52.3 },
{ “_id”: ISODate(“2026-04-08T09:00:00Z”), “avgTemperature”: 24.2, “avgHumidity”: 53.1 },
{ “_id”: ISODate(“2026-04-08T10:00:00Z”), “avgTemperature”: 25.1, “avgHumidity”: 54.5 }
]
风哥提示:时序集合的聚合查询性能优于普通集合,适合处理大量时序数据的统计分析。
Part05-风哥经验总结与分享
5.1 时序数据最佳实践
风哥建议的时序数据最佳实践:
- 选择合适的时间粒度(granularity),根据数据采集频率选择 seconds、minutes 或 hours
- 合理设计元数据字段,避免过多或过少的元数据
- 使用批量写入减少网络开销,提高写入性能
- 设置适当的数据保留策略,自动清理过期数据
- 为常用查询创建合适的索引
学习交流加群风哥QQ113257174
5.2 性能优化建议
时序数据存储的性能优化建议:
- 使用合适的硬件配置,尤其是SSD存储
- 调整WiredTiger存储引擎参数,优化写入性能
- 使用副本集分散读负载
- 考虑使用分片集群处理超大规模时序数据
- 监控时序集合的性能,及时调整配置
更多视频教程www.fgedu.net.cn
注意事项
- 时序集合仅在MongoDB 5.0及以上版本可用
- 时间字段必须是日期类型,且包含时间戳信息
- 元数据字段应保持稳定,避免频繁变化
- 批量写入时注意控制批量大小,避免内存占用过高
- 定期监控时序集合的大小和性能
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
