Обработка базы данных временных рядов в node-js и Mongodb - PullRequest
0 голосов
/ 02 марта 2020

На самом деле я создаю базу данных датчиков температуры iot с базой данных серии событий, содержащей 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 se c Я получаю данные от датчика, и сначала я сравниваю текущее значение с последним значением, и если это значение изменяется, я запускаю событие и обновляю последнее значение, которое имеет значение end_timestamp null, из-за события l oop очень занят и асин c природа узла иногда 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 какой-либо метод, который я использовал для выполнения этой операции вместе.

Дайте мне любезную помощь Заранее спасибо

1 Ответ

0 голосов
/ 02 марта 2020

Мой подход заключается в создании двух коллекций (или одной коллекции и агрегации).

Первая коллекция содержит только необработанные данные датчика, я предполагаю, что они имеют только значение метки времени:

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" } } к конвейеру агрегации.

...