You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:02:47