У меня есть вариант использования, в котором у меня есть несколько устройств, которые продолжают вставлять данные в 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
}
}
Теперь мне нужно получить такой результат для всех устройства и то же самое только с самой последней вставленной записью (последней записью).
Возможно ли получить это на уровне запроса? Устройства не имеют фиксированных номеров, могут иметь одно или несколько устройств. Или мне нужно написать какую-нибудь другую функцию, чтобы получить это?