1. 首页 > MongoDB教程 > 正文

MongoDB教程FG062-MongoDB时序数据存储实战

本文主要介绍MongoDB数据库的时序数据存储功能,包括时序集合的创建、查询和优化等核心操作。风哥教程参考MongoDB官方文档Time Series Collections相关章节。

目录大纲

Part01-基础概念与理论知识

Part02-生产环境规划与建议

Part03-生产环境项目实施方案

Part04-生产案例与实战讲解

Part05-风哥经验总结与分享

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

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息