Как рассчитать сумму последних вставленных значений в mongodb, используя node js? - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть вариант использования, в котором у меня есть несколько устройств, которые продолжают вставлять данные в mongodb. До сих пор я вычислял последнее вставленное значение каждого устройства, используя deviceId, и сравнивал данные с заданным периодом времени. Если мы выберем monthly с помощью deviceId, он должен вернуть данные за последние 6 месяцев и разницу между данными за текущий и прошлый месяц. Могут быть ситуации, чтобы выбрать один из этих weekly or quarterly.

Но мне нужно найти последние вставленные данные для каждого устройства, а также рассчитать сумму и различия, в которых я запутался.

Это пример кода.

[
  {
    "_id": "5e0ae793b1384737a4f855cf",
    "entryDayTime" : ISODate("2019-02-25T09:25:37.059Z")
    "deviceId": "waterTest",
    "heat" : 20,
    "humidity" : 10
   },{
      "_id": "5e0ae7a2b1384737a4f855d0",
      "entryDayTime" : ISODate("2019-02-19T09:25:37.059Z")
      "deviceId": "waterTest",
      "heat" : 40,
      "humidity" : 20
   },{
      "_id": "5e0ae890b1384737a4f855d3",
      "entryDayTime" : ISODate("2020-01-19T09:25:37.059Z")
      "deviceId": "waterTest",
      "heat" : 60,
      "humidity" : 50
    },{
       "_id": "5e0af188981f39410cd89b73",
       "entryDayTime" : ISODate("2019-11-19T09:25:37.059Z")
       "deviceId": "Test",
       "heat": 60,
       "humidity": 50
   },{
      "_id": "5e0af196981f39410cd89b74",
      "entryDayTime" : ISODate("2019-12-19T09:25:37.059Z")
      "deviceId": "Test",
      "heat": 10,
      "humidity": 20
   }]

И запрос для quarterly данных:

if(filter == "quarterly" && device!==undefined && payload.device){
            [err, avgValue] = await to(mongoose.connection.db.collection(tempUniqueId)
                    .aggregate([
                        {
                            $match: {
                                "deviceId": payload.device
                            }
                        },
                        {
                            $group:{
                                _id:{
                                    year: {$year: "$entryDayTime"},
                                    quarter: {
                                        $cond:[{
                                            $lte:[{$month:"$entryDayTime"},3]},"Q1",
                                                {$cond:[{$lte:[{$month:"$entryDayTime"},6]}, "Q2",
                                                    {$cond:[{$lte:[{$month:"$entryDayTime"},9]},"Q3","Q4"]}]}]
                                    }
                                },
                                value: aggreQuery
                            }
                        }
                    ]).toArray());
            if (err) {TE(err.message);}
        }

И запрос для monthly/weekly данных:

if(payload.device!==undefined && payload.device && filter!=="quarterly"){
            [err, avgValue] = await to(mongoose.connection.db.collection(tempUniqueId)
                    .aggregate([
                        {
                            $match: {
                                "deviceId": payload.device
                            }
                        },
                        {
                            $group: {
                                _id: day,
                                value: aggreQuery
                            }
                        },
                        {
                            $sort: { _id: -1 }
                        },
                        {
                            $project: { value: { '$divide': [{ '$trunc': { '$add': [{ '$multiply': ['$value', 100] }, 0.5] } }, 100] } }
                        }]).toArray());
            if (err) {TE(err.message);}
        }

Я уже написал некоторые функции сравнивать данные с каждым месяцем / кварталом / неделей, чтобы проверить, доступны ли данные в базе данных или нет. Если данные доступны, вернет данные или вернет 0.

Пример данных будет,

"data": {
        "variables": [
            "heat"
        ],
        "lables": [
            "Feb-2020",
            "Jan-2020",
            "Dec-2019",
            "Nov-2019",
            "Oct-2019",
            "Sep-2019"
        ],
        "values": [
            [
                120,
                65,
                11,
                15,
                0,
                0
            ]
        ],
        "current": {
            "_id": "Feb-2020",
            "heat": 120
        },
        "previous": {
            "_id": "Jan-2020",
            "heat": 65
        },
        "difference": {
            "heat": 55
        }
    }

Теперь мне нужно получить такой результат для всех устройства и то же самое только с самой последней вставленной записью (последней записью).

Возможно ли получить это на уровне запроса? Устройства не имеют фиксированных номеров, могут иметь одно или несколько устройств. Или мне нужно написать какую-нибудь другую функцию, чтобы получить это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...