2015-04-17 5 views
0

Я использую базу данных MongoDB со следующей структурой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 секунд, например

Заранее благодарен!

+0

Вы имеете в виду для каждого значения из поля 'd_second' каждого документа или для каждой секунды (длинный опрос)? – chridam

+0

@chridam Представьте, что вместо «d_second», «d_minute» и т. Д. Будет только поле «timestamp». Я бы хотел рассчитать скользящее среднее из 30 последних «d_second» (один документ в секунду вставлен) , поэтому результаты будут иметь временную метку и скользящую среднюю, соответствующую среднему значению последнего 30-значного значения (последняя 30 временных меток) (это ясно?) – cam

ответ

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 секунд, а затем группировать по дате/отметке времени, чтобы получить среднее значение.

+0

Похоже, ваше решение это дает только одно скользящее среднее значение , в течение одной секунды (исправьте меня, если я ошибаюсь), и я бы хотел, чтобы результат был таблицей со всей скользящей средней всех секунд. Это возможно как-то? – cam

+0

Посмотрите на [moving-average-with-mongodbs-aggregation-framework] (http://stackoverflow.com/questions/25151042/moving-averages-with-mongodbs-aggregation-framework). – thegreenogre

Смежные вопросы