1

Я Habe большого набора документов, которые выглядят как этотГруппы п документов с MongoDB

{value: 13, date: 2017-28-01 12:00:01, channel: A} 
    {value: 14, date: 2017-28-01 12:00:01, channel: B} 
    {value: 138, date: 2017-28-01 12:00:02, channel: A} 
    {value: 11, date: 2017-28-01 12:00:12, channel: A} 
    {value: 17, date: 2017-28-01 12:00:09, channel: C} 
    ... 

запросом Я ищу должен разделить каждый канал в группах из 3 элементов (отсортированный по дате) и возвращаем среднее значение значения и даты для каждой группы.

Результат должен выглядеть следующим образом

[ 
     {average: 54, average_date: 2017-28-01 12:00:05, count: 3, channel: A}, 
     {average: 12, average_date: 2017-28-01 12:00:06, count: 3, channel: B} 
     {average: 90, average_date: 2017-28-01 12:00:15, count: 3, channel: A}, 
     {average: 561, average_date: 2017-28-01 12:00:05, count: 3, channel: C}, 
] 

Так же, как имеющие ведра, которые могут содержать три элемента и только элементы одного и того же канала могут быть помещены в одно ведро.

Это агрегирование будет использоваться для отображения только определенного количества значений на линейной диаграмме.

ответ

0

Вы можете попробовать выполнить агрегацию.

$sortdate по возрастанию.

$group на date & channel и push значений.

$project до slice до 3-х канальных значений и вычислить среднее значение.

db.collection.aggregate({ 
    $sort: { 
     date: 1 
    } 
}, { 
    $group: { 
     _id: {date:"$date", channel:"$channel"}, 
     values: { 
      $push: "$value" 
     } 
    } 
}, { 
    $project: { 
     _id: 0, 
     channel: "$_id.channel", 
     average_date: "$_id.date", 
     average: {$avg:{$slice: ["$values", 3] }} 
    } 
})