IoT室内温湿度监测应用:如何每5分钟将数据存入MongoDB?
解决IoT温湿度数据定时存储到MongoDB的方案
嘿,这个需求在IoT数据采集场景里太常见了!核心思路就是先实时获取数据但暂存,再按固定间隔单次/聚合写入数据库,下面给你几个具体的实现方式,分编程语言举例子:
1. 基础定时循环(适合轻量脚本,比如Python/Node.js)
如果你的应用是简单的采集脚本,用基础的定时循环就能搞定,同时维护变量保存最新数据:
Python 示例
import time from pymongo import MongoClient # 初始化MongoDB连接 client = MongoClient('mongodb://localhost:27017/') db = client['iot_db'] collection = db['temp_humidity'] # 模拟每2秒获取一次温湿度的函数(替换成你的传感器读取逻辑) def get_sensor_data(): return {"temperature": 25.6, "humidity": 62.3, "timestamp": time.time()} latest_data = {} save_interval = 5 * 60 # 5分钟,单位秒 last_save_time = time.time() while True: # 每2秒更新最新数据 latest_data = get_sensor_data() print("更新实时温湿度数据") # 检查是否到了5分钟存储间隔 current_time = time.time() if current_time - last_save_time >= save_interval: collection.insert_one(latest_data) print("成功存储数据到MongoDB") last_save_time = current_time time.sleep(2)
Node.js 示例
const { MongoClient } = require('mongodb'); const url = 'mongodb://localhost:27017/'; const dbName = 'iot_db'; let latestData = {}; const updateInterval = 2000; // 2秒 const saveInterval = 5 * 60 * 1000; // 5分钟 // 模拟获取传感器数据 function getSensorData() { return { temperature: 25.6, humidity: 62.3, timestamp: Date.now() }; } // 定时更新最新数据 setInterval(() => { latestData = getSensorData(); console.log('更新实时温湿度数据'); }, updateInterval); // 定时存储到MongoDB setInterval(async () => { const client = new MongoClient(url); try { await client.connect(); const db = client.db(dbName); const collection = db.collection('temp_humidity'); await collection.insertOne(latestData); console.log('成功存储温湿度数据到MongoDB'); } finally { await client.close(); } }, saveInterval);
2. 使用专业定时任务库(适合复杂场景)
如果你的应用需要更灵活的定时规则(比如每天固定时段存储、节假日排除等),推荐用专业的定时任务库:
Python:APScheduler
支持多种触发器(间隔、Cron表达式等),适合后台长期运行的服务:
from apscheduler.schedulers.background import BackgroundScheduler import time from pymongo import MongoClient # 初始化MongoDB连接和数据函数(同前面示例) client = MongoClient('mongodb://localhost:27017/') db = client['iot_db'] collection = db['temp_humidity'] def get_sensor_data(): return {"temperature": 25.6, "humidity": 62.3, "timestamp": time.time()} latest_data = {} def update_latest_data(): global latest_data latest_data = get_sensor_data() print("更新实时温湿度数据") def save_to_mongodb(): if latest_data: collection.insert_one(latest_data) print("存储数据到MongoDB") # 创建后台调度器 scheduler = BackgroundScheduler() # 每2秒更新一次数据 scheduler.add_job(update_latest_data, 'interval', seconds=2) # 每5分钟执行一次存储任务 scheduler.add_job(save_to_mongodb, 'interval', minutes=5) scheduler.start() # 保持脚本运行 try: while True: time.sleep(1) except (KeyboardInterrupt, SystemExit): scheduler.shutdown()
Node.js:node-schedule
同样支持灵活的定时规则,适合Node.js环境的IoT应用:
const schedule = require('node-schedule'); // 其余MongoDB连接和数据函数同前面示例 // 每2秒更新数据 schedule.scheduleJob('*/2 * * * * *', () => { latestData = getSensorData(); console.log('更新实时温湿度数据'); }); // 每5分钟存储一次(第0秒触发) schedule.scheduleJob('0 */5 * * * *', async () => { const client = new MongoClient(url); try { await client.connect(); const db = client.db(dbName); const collection = db.collection('temp_humidity'); await collection.insertOne(latestData); console.log('成功存储温湿度数据到MongoDB'); } finally { await client.close(); } });
3. 进阶:存储时间段内的聚合数据
如果不想只存最新值,还可以每5分钟存储这段时间内的平均值、最大值、最小值,更适合后续数据分析:
import time from pymongo import MongoClient client = MongoClient('mongodb://localhost:27017/') db = client['iot_db'] collection = db['temp_humidity_aggregated'] def get_sensor_data(): return {"temperature": 25.6, "humidity": 62.3, "timestamp": time.time()} data_buffer = [] save_interval = 5 * 60 last_save_time = time.time() while True: # 每2秒追加数据到缓冲区 data = get_sensor_data() data_buffer.append(data) print("追加实时温湿度数据到缓冲区") current_time = time.time() if current_time - last_save_time >= save_interval: if not data_buffer: continue # 计算时间段内的聚合值 avg_temp = sum(d['temperature'] for d in data_buffer) / len(data_buffer) avg_humidity = sum(d['humidity'] for d in data_buffer) / len(data_buffer) max_temp = max(d['temperature'] for d in data_buffer) min_temp = min(d['temperature'] for d in data_buffer) aggregated_data = { "avg_temperature": round(avg_temp, 2), "avg_humidity": round(avg_humidity, 2), "max_temperature": max_temp, "min_temperature": min_temp, "start_timestamp": data_buffer[0]['timestamp'], "end_timestamp": data_buffer[-1]['timestamp'] } collection.insert_one(aggregated_data) print("存储聚合数据到MongoDB") # 清空缓冲区并更新存储时间 data_buffer.clear() last_save_time = current_time time.sleep(2)
这样既减少了数据库的存储压力,又保留了时间段内的统计信息,实用性更强~
内容的提问来源于stack exchange,提问作者narutouzumaki 99
相关产品推荐
相关产品推荐

