Получить последние значения MongoDB с агрегацией - PullRequest
0 голосов
/ 04 октября 2018

Мне нужно восстановить последние значения моей коллекции, но мне нужно сделать это с помощью агрегации mongodb, поскольку у меня есть JOIN с другой коллекцией.

Это код моего запроса:

Я передаю массив с датчиками, которые мне нужны для восстановления.

function getDataSensorGreenhousetypeFechasJoin (req, res){
  var array = req.params.nombresensores;
  var arr = array.split(',');
  var id_greenhouse = req.params.id_greenhouse;

  Datagreenhouse.aggregate([
  {"$match":{"attrName":{"$in":arr}}},
  {"$sort":{"recvTime":-1}},
  {"$lookup":{
    "from":"sensors",
    "localField":"attrName", // local field in measurements collection
    "foreignField":"name", //foreign field from sensors collection
    "as":"sensor"
  }},
  {"$unwind":"$sensor"},
  {"$addFields":{
    "sensor.attrName":"$attrName",// Add attrName to the sensors
    "sensor.attrValue":"$attrValue",// Add attrValue to the sensors
    "sensor.recvTimeTs":"$recvTimeTs",
    "sensor.recvTime":"$recvTime"
  }},
  {"$group":{
    "_id":"$attrName", // Group by time
    "medidas":{"$push":"$sensor"}, // Collect measurements
    "count":{"$sum":1} // Count measurements
  }},
  {"$limit":1}
  ], (err, DatagreenhouseRecuperado) => {
    if (err) return res.status(500).send({message: 'Error al realizar la peticion' + err})
    if (!DatagreenhouseRecuperado) return res.status(404).send({message: 'Error el usuario no existe'})
    res.status(200).send({DatagreenhouseRecuperado})
    })
}

Это результат:

{
        "DatagreenhouseRecuperado": [
            {
                "_id": "457",
                "medidas": [
                    {
                        "_id": "5bab51c69a3969055b6bf344",
                        "name": "42-457",
                        "type": "clima",
                        "place": "interior",
                        "img": "assets/img/contrast.png",
                        "name_comun": "Radiación solar",
                        "medida": "W/m²",
                        "usuario": "5bab4aa69a3969055b6bf334",
                        "invernadero": "5bab4dbb9a3969055b6bf339",
                        "__v": 0,
                        "attrName": "42-457",
                        "attrValue": 5.215478125,
                        "recvTimeTs": 1538047310,
                        "recvTime": "2018-09-27T11:21:50.000Z"
                    },
                    {
                        "_id": "5bab4e4d9a3969055b6bf33a",
                        "name": "3-457",
                        "type": "clima",
                        "place": "interior",
                        "img": "assets/img/hum.png",
                        "name_comun": "Hum. Relativa",
                        "medida": "%",
                        "usuario": "5bab4aa69a3969055b6bf334",
                        "invernadero": "5bab4dbb9a3969055b6bf339",
                        "__v": 0,
                        "attrName": "3-457",
                        "attrValue": 57.6,
                        "recvTimeTs": 1538047193,
                        "recvTime": "2018-09-27T11:19:53.000Z"
                    },
                    {
                        "_id": "5bab511e9a3969055b6bf33f",
                        "name": "5-457",
                        "type": "clima",
                        "place": "interior",
                        "img": "assets/img/temp.png",
                        "name_comun": "Temp. Suelo",
                        "medida": "ºC",
                        "usuario": "5bab4aa69a3969055b6bf334",
                        "invernadero": "5bab4dbb9a3969055b6bf339",
                        "__v": 0,
                        "attrName": "5-457",
                        "attrValue": 29.222,
                        "recvTimeTs": 1537984323,
                        "recvTime": "2018-09-26T17:52:03.000Z"
                    },
                    {
                        "_id": "5bab51c69a3969055b6bf344",
                        "name": "42-457",
                        "type": "clima",
                        "place": "interior",
                        "img": "assets/img/contrast.png",
                        "name_comun": "Radiación solar",
                        "medida": "W/m²",
                        "usuario": "5bab4aa69a3969055b6bf334",
                        "invernadero": "5bab4dbb9a3969055b6bf339",
                        "__v": 0,
                        "attrName": "42-457",
                        "attrValue": 137.137,
                        "recvTimeTs": 1537954419,
                        "recvTime": "2018-09-26T09:33:39.000Z"
                    }
                ],
                "count": 24
            }
        ]
    }

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

Мне нужно последнее значение, которое имеет каждый датчик.

Как мне завершить настройку запроса?

Спасибо.

> EDIT01

Я попробовал несколько вещей,

с этим кодом, если я получаю то, что мне нужно, но исключаю часть соединения, и необходимо иметьдругие поля, мой вопрос, как я могу сделать часть JOIN с этим кодом

{"$match":{"attrName":{"$in":arr}}},
  {"$sort":{"recvTime":-1}},
  {"$lookup":{
    "from":"sensors",
    "localField":"attrName", // local field in measurements collection
    "foreignField":"name", //foreign field from sensors collection
    "as":"sensor"
  }},
  {"$unwind":"$sensor"},
  {"$addFields":{
    "sensor.attrName":"$attrName",// Add attrName to the sensors
    "sensor.attrValue":"$attrValue",// Add attrValue to the sensors
    "sensor.recvTimeTs":"$recvTimeTs",
    "sensor.recvTime":"$recvTime"
  }},
  {"$group":{
    "_id":"$attrName", // Group by time
    "attrName":{$last:"$attrName"},
    "attrValue":{$last:"$attrValue"},
    "recvTime":{$last:"$recvTime"},
    "medidas":{"$push":"$sensor",}, // Collect measurements
    "count":{"$sum":1} // Count measurements
  }},

У меня проблемы с нажимом и датчиком

Edit02

Привет, Мой ответ должен быть примерно таким:

Мне нужно, чтобы выПоказывать только последние значения списка датчиков по дате.

Я не знаю, достаточно ли этой информации.Перед агрегированием по дате проблема заключается в том, что некоторые данные, сохраненные в разное время, некоторые данные не отображаются по этой причине. Мне нужно показать последние сохраненные данные датчиков.

{
        "DatagreenhouseRecuperado": [
            {
                "_id": "457",
                "medidas": [
                    {
                        "_id": "5bab51c69a3969055b6bf344",
                        "name": "42-457",
                        "type": "clima",
                        "place": "interior",
                        "img": "assets/img/contrast.png",
                        "name_comun": "Radiación solar",
                        "medida": "W/m²",
                        "usuario": "5bab4aa69a3969055b6bf334",
                        "invernadero": "5bab4dbb9a3969055b6bf339",
                        "__v": 0,
                        "attrName": "42-457",
                        "attrValue": 5.215478125,
                        "recvTimeTs": 1538047310,
                        "recvTime": "2018-09-27T11:21:50.000Z"
                    },
                    {
                        "_id": "5bab51529a3969055b6bf340",
                        "name": "17-457",
                        "type": "clima",
                        "place": "interior",
                        "img": "assets/img/contrast.png",
                        "name_comun": "Rad. Solar PAR",
                        "medida": "W/m²",
                        "usuario": "5bab4aa69a3969055b6bf334",
                        "invernadero": "5bab4dbb9a3969055b6bf339",
                        "__v": 0,
                        "attrName": "17-457",
                        "attrValue": 112.165625,
                        "recvTimeTs": 1538047193,
                        "recvTime": "2018-09-27T11:19:53.000Z"
                    },
                    {
                        "_id": "5bab519d9a3969055b6bf342",
                        "name": "21-457",
                        "type": "clima",
                        "place": "interior",
                        "img": "assets/img/co264.png",
                        "name_comun": "CO2",
                        "medida": "ppm",
                        "usuario": "5bab4aa69a3969055b6bf334",
                        "invernadero": "5bab4dbb9a3969055b6bf339",
                        "__v": 0,
                        "attrName": "21-457",
                        "attrValue": 827.6,
                        "recvTimeTs": 1538047193,
                        "recvTime": "2018-09-27T11:19:53.000Z"
                    },
                    {
                        "_id": "5bab511e9a3969055b6bf33f",
                        "name": "5-457",
                        "type": "clima",
                        "place": "interior",
                        "img": "assets/img/temp.png",
                        "name_comun": "Temp. Suelo",
                        "medida": "ºC",
                        "usuario": "5bab4aa69a3969055b6bf334",
                        "invernadero": "5bab4dbb9a3969055b6bf339",
                        "__v": 0,
                        "attrName": "5-457",
                        "attrValue": 27.844,
                        "recvTimeTs": 1538047193,
                        "recvTime": "2018-09-27T11:19:53.000Z"
                    },
                    {
                        "_id": "5bab4e4d9a3969055b6bf33a",
                        "name": "3-457",
                        "type": "clima",
                        "place": "interior",
                        "img": "assets/img/hum.png",
                        "name_comun": "Hum. Relativa",
                        "medida": "%",
                        "usuario": "5bab4aa69a3969055b6bf334",
                        "invernadero": "5bab4dbb9a3969055b6bf339",
                        "__v": 0,
                        "attrName": "3-457",
                        "attrValue": 57.6,
                        "recvTimeTs": 1538047193,
                        "recvTime": "2018-09-27T11:19:53.000Z"
                    },
                    {
                        "_id": "5bab4f009a3969055b6bf33b",
                        "name": "2-457",
                        "type": "clima",
                        "place": "interior",
                        "img": "assets/img/temp.png",
                        "name_comun": "Temp. Ambiente",
                        "medida": "ºC",
                        "usuario": "5bab4aa69a3969055b6bf334",
                        "invernadero": "5bab4dbb9a3969055b6bf339",
                        "__v": 0,
                        "attrName": "2-457",
                        "attrValue": 32.2,
                        "recvTimeTs": 1538047193,
                        "recvTime": "2018-09-27T11:19:53.000Z"
                    }
                ],
                "count": 24
            }
        ]
    }

Я основан наэтот пример, поскольку он такой же, только то, что он не имеет объединения

Ejemplo

EDIT03

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

Это часть кода, которую я добавил какВы сказали мне

{"$group":{
    "_id":"$id_greenhouse",
    "latest":{"$first":"$$ROOT"},
  }},
 {"$project":{
    "_id":0,
    "id_greenhouse":"$latest.id_greenhouse",
    "attrName":"$latest.attrName",
    "attrValue":"$latest.attrValue",
    "recvTimeTs":"$latest.recvTimeTs",
    "recvTime":"$latest.recvTime"
  }},

Результат

    {
    "DatagreenhouseRecuperado": [
        {
            "_id": "457",
            "medidas": [
                {
                    "_id": "5bab50f09a3969055b6bf33e",
                    "name": "6-457",
                    "type": "fertigation",
                    "place": "interior",
                    "img": "assets/img/hum.png",
                    "name_comun": "Humedad del Suelo",
                    "medida": "%",
                    "usuario": "5bab4aa69a3969055b6bf334",
                    "invernadero": "5bab4dbb9a3969055b6bf339",
                    "__v": 0,
                    "attrName": "6-457",
                    "attrValue": 39.4,
                    "recvTimeTs": 1537954419,
                    "recvTime": "2018-09-28T09:33:39.000Z",
                    "id_greenhouse": "457"
                }
            ],
            "count": 1
        }
    ]
}

1 Ответ

0 голосов
/ 05 октября 2018

Добавить $group + $project этап после $sort и до $lookup этап.

Что-то вроде

 {"$group":{
    "_id":"$attrName",
    "latest":{"$first":"$$ROOT"},
  }},
 {"$project":{
    "_id":0,
    "id_greenhouse":"$latest._id",
    "attrName":"$latest.attrName",
    "attrValue":"$latest.attrValue",
    "recvTimeTs":"$latest.recvTimeTs",
    "recvTime":"$latest.recvTime"
  }}
...