1

Ich Habe eine große Menge von Dokumenten, die diese aussehenGruppe n Dokumente mit 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} 
    ... 

Die Abfrage ich suche sollte jeden Kanal in Gruppen von 3 Elementen (sortiert nach Datum) aufgeteilt und gibt den Durchschnitt Wert und Datum für jede Gruppe.

Das Ergebnis sollte wie folgt aussehen

[ 
     {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}, 
] 

Genau wie mit Eimern, die drei Elemente und nur Elemente des gleichen Kanals einen Eimer enthalten Satz integriert werden kann.

Diese Aggregation wird verwendet, um nur eine bestimmte Anzahl von Werten in einem Liniendiagramm anzuzeigen.

Antwort

0

Sie können unter Aggregation versuchen.

$sort auf date asc.

$group auf date & channel und push Werte.

bis slice bis 3 Kanalwerte und berechnen Sie den Durchschnitt.

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] }} 
    } 
})