我使用具有以下结构的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秒“amount”值的平均值,例如
提前致谢!
答案 0 :(得分:1)
您可以使用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秒内匹配文档,然后对日期/时间戳进行分组以获得平均值。