Я использую базу данных MongoDB со следующей структурой
"_id": ObjectId("5531214ff31ca6e6368b54e6"),
"d_second": NumberLong(51),
"d_minute": NumberLong(5),
"d_hour": NumberLong(17),
"d_day": NumberLong(17),
"d_week": NumberLong(16),
"d_month": NumberLong(4),
"d_year": NumberLong(2015),
"amount": 1.30005,
Как построить запрос, который будет возвращать массив, предоставляющий для каждой секунды среднее значение «суммы», например, за последние 30 секунд?
Заранее спасибо!
Ты можешь использовать aggragation
db.Testing.aggregate([{ $project:
{ date:
{ "$concat": [
{ "$cond": [
{ "$lte": [ "$d_month", 9 ] },
{ "$concat": [
"0",
{ "$substr": [ "$d_month" , 0, 2 ] },
]},
{ "$substr": [ "$d_month", 0, 2 ] }
]},
" ",
{ "$cond": [
{ "$lte": [ "$d_day", 9 ] },
{ "$concat": [
"0",
{ "$substr": [ "$d_day" , 0, 2 ] },
]},
{ "$substr": [ "$d_day", 0, 2 ] }
]},
" ",
{ "$substr": [ "$d_year", 0, 4 ] },
" ",
{ "$cond": [
{ "$lte": [ "$d_hour", 9 ] },
{ "$concat": [
"0",
{ "$substr": [ "$d_hour" , 0, 2 ] },
]},
{ "$substr": [ "$d_hour", 0, 2 ] }
]},
":",
{ "$cond": [
{ "$lte": [ "$d_minute", 9 ] },
{ "$concat": [
"0",
{ "$substr": [ "$d_minute" , 0, 2 ] },
]},
{ "$substr": [ "$d_minute", 0, 2 ] }
]},
":",
{ "$cond": [
{ "$lte": [ "$d_second", 9 ] },
{ "$concat": [
"0",
{ "$substr": [ "$d_second" , 0, 2 ] },
]},
{ "$substr": [ "$d_second", 0, 2 ] }
]},
]},
'amount' :1
}
},
{'$group' : {'_id' : '$date' ,'avg' : {'$avg' : '$amount'}}},
{'$sort' : {'_id' : -1}},
{'$limit' : 30}
])
Помните, что это даст вам среднее значение за последние 30 временных отметок, а не 30 секунд.
Также было бы лучше использовать Date
или time-stamp
объект вместо разных ключей. В этом случае вы можете сопоставить документы за последние 30 секунд, а затем выполнить группировку по дате / времени, чтобы получить среднее значение.
Других решений пока нет …