【问题标题】:Time-interval series database handling in node-js and Mongodbnode-js 和 Mongodb 中的时间间隔系列数据库处理
【发布时间】:2020-03-02 20:48:00
【问题描述】:

实际上,我正在创建一个物联网温度传感器数据库,其中包含一个包含 start_timestamp 和 end_timestamp 的事件系列数据库,对于每个温度变化事件,我都会在数据库中插入一个新文档, 我的架构是

var tempSchema = mongoose.Schema({
    sensor_name:{
        type:String
    },
    temp_value:{
        type:Number
    },
    start_timestamp:{
        type:Date,
    },
    end_timestamp:{
        type:Date,
        default:null
    }
});

对于每个新文档插入,我必须首先更新最后一个事件的 end_timestamp,然后插入具有与我更新最后一个文档 end_timestamp 相同的时间戳的新文档。

我面临的问题

1) 我有 30 个传感器,每 2 秒我从传感器获取数据,首先我将当前值与最后一个值进行比较,如果这个值发生变化,我将触发一个事件并更新 end_timestamp 为空的最后一个值,因为事件循环非常繁忙并且节点的异步性质有时在数据库中插入相同事件的 2 个条目,唯一的区别 start_timestamp 不同(如 2020-02-22T15:52:21.639+00:00 和 2020-02-22T15: 52:21.710+00:00) 但理想情况下应该在数据库中只有一个 end_timestamp null

2) 2 个操作同时发生,现在我使用 2 个函数进行单独的操作,例如 update_entry 用于 end_timestamp 更新和 post_entry 用于新文档,mongodb 中是否有任何方法可以一起执行此操作。

请帮帮我 提前致谢

【问题讨论】:

    标签: javascript node.js mongodb mongoose iot


    【解决方案1】:

    我的方法是创建两个集合(或一个集合和一个聚合)。

    第一个集合只包含原始传感器数据,我假设它们只有时间戳值:

    db.collection.insertMany([
       { sensor_name: "sensor 1", temp_value: 30.2, timestamp: new Date("2020-02-22T15:52:21.639Z") },
       { sensor_name: "sensor 1", temp_value: 31.2, timestamp: new Date("2020-02-22T15:52:23.639Z") },
       { sensor_name: "sensor 1", temp_value: 32.2, timestamp: new Date("2020-02-22T15:52:25.639Z") },
       { sensor_name: "sensor 1", temp_value: 32.2, timestamp: new Date("2020-02-22T15:52:27.639Z") },
       { sensor_name: "sensor 1", temp_value: 32.2, timestamp: new Date("2020-02-22T15:52:29.639Z") },
       { sensor_name: "sensor 3", temp_value: 12.2, timestamp: new Date("2020-02-22T15:52:00.639Z") }
    ])
    

    然后你可以聚合这些值:

    db.collection.aggregate([
       { $sort: { timestamp: 1 } },
       {
          $group: {
             _id: "$sensor_name",
             temp_value: { $last: "$temp_value" },
             start_timestamp: { $first: "$timestamp" },
             count: { $sum: 1 },
             end_timestamp: { $last: "$timestamp" },
             min_temp: { $min: "$temp_value" },
             max_temp: { $max: "$temp_value" },
          }
       }
    ])
    

    如果您需要将结果存储在集合中,请将{ $merge: { into: "temperatures" } } 附加到聚合管道。

    【讨论】:

    • 感谢@Wernfried Domscheit 的帮助,这是我认为最好的解决方案,但如何确保数据库中没有重复条目
    • 没关系。 start_timestampend_timestampmin_temp 等值将保持不变。否则创建唯一索引createIndex({ sensor_name: 1, timestamp: 1 }, {unique: true})
    猜你喜欢
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多