MongoDB - 请求移动平均线

时间:2015-04-17 15:24:39

标签: php mongodb nosql

我使用具有以下结构的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”值的平均值,例如

提前致谢!

1 个答案:

答案 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秒。

最好使用Datetime-stamp对象而不是不同的键。在这种情况下,您可以在30秒内匹配文档,然后对日期/时间戳进行分组以获得平均值。