Javascript node js和Mongodb中的时间间隔序列数据库处理

Javascript node js和Mongodb中的时间间隔序列数据库处理,javascript,node.js,mongodb,mongoose,iot,Javascript,Node.js,Mongodb,Mongoose,Iot,实际上,我正在创建一个物联网温度传感器数据库,其中有一个事件系列数据库,包含开始时间戳和结束时间戳,对于每个温度变化事件,我在数据库中插入一个新文档, 我的模式是 var tempSchema = mongoose.Schema({ sensor_name:{ type:String }, temp_value:{ type:Number }, start_timestamp:{ type:Date,

实际上,我正在创建一个物联网温度传感器数据库,其中有一个事件系列数据库,包含开始时间戳和结束时间戳,对于每个温度变化事件,我在数据库中插入一个新文档, 我的模式是

var tempSchema = mongoose.Schema({
    sensor_name:{
        type:String
    },
    temp_value:{
        type:Number
    },
    start_timestamp:{
        type:Date,
    },
    end_timestamp:{
        type:Date,
        default:null
    }
});
对于每个新文档插入,我必须首先更新最后一个事件的end_时间戳,然后插入具有与我更新的最后一个文档end_时间戳相同的时间戳的新文档

我面临的问题

1) 我有30个传感器,每隔2秒我会从传感器获取数据,首先我会比较当前值和最后一个值,如果这个值发生变化,我会触发一个事件并更新最后一个值,该值的结束时间戳为null,由于事件循环非常繁忙,节点有时具有异步性质,在数据库中插入相同事件的两个条目,唯一不同的开始时间戳是不同的(如2020-02-22T15:52:21.639+00:00和2020-02-22T15:52:21.710+00:00),但理想情况下数据库中应该只有一个结束时间戳null

2) 2个操作同时发生,现在我使用2个函数来进行单独的操作,比如,对end\u时间戳更新使用update\u条目,对新文档使用post\u条目,mongodb中是否有我用来一起执行此操作的方法

给我你善意的帮助
提前感谢

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

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

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\u timestamp
end\u timestamp
min\u temp
等值将保持不变。否则,创建一个唯一的索引
createIndex({sensor_name:1,timestamp:1},{unique:true})