Вы можете использовать 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 секунд, а затем группировать по дате/отметке времени, чтобы получить среднее значение.
Вы имеете в виду для каждого значения из поля 'd_second' каждого документа или для каждой секунды (длинный опрос)? – chridam
@chridam Представьте, что вместо «d_second», «d_minute» и т. Д. Будет только поле «timestamp». Я бы хотел рассчитать скользящее среднее из 30 последних «d_second» (один документ в секунду вставлен) , поэтому результаты будут иметь временную метку и скользящую среднюю, соответствующую среднему значению последнего 30-значного значения (последняя 30 временных меток) (это ясно?) – cam