Мне нужно восстановить последние значения моей коллекции, но мне нужно сделать это с помощью агрегации 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
}
]
}