2015-03-05 2 views
3

Я записи данных в MongoDB в следующем формате:MongoDB - Совокупные макс/мин/среднее для нескольких переменных сразу

{ "_id" : ObjectId("54f2393f80b72b00079d1a53"), "outT" : 10.88, "inT3" : 22.3, "light" : 336, "humidity" : 41.4, "pressure" : 990.31, "inT1" : 22.81, "logtime" : ISODate("2015-02-28T21:55:11.838Z"), "inT2" : 21.5 } 
{ "_id" : ObjectId("54f2394580b72b00079d1a54"), "outT" : 10.88, "inT3" : 22.3, "light" : 338, "humidity" : 41.4, "pressure" : 990.43, "inT1" : 22.75, "logtime" : ISODate("2015-02-28T21:55:17.690Z"), "inT2" : 311.72 } 
... 

Как вы можете видеть, что есть один элемент времени и несколько чтений вошли. Я хочу объединить все показания, чтобы обеспечить максимальный минимум и среднее значение для каждой переменной, сгруппированной по часам дня. Мне удалось сделать это для одной переменной, используя следующую агрегирования скрипт:

db.logs.aggregate(
    [ 
     { 
      $match: { 
       logtime: { 
        $gte: ISODate("2015-03-01T00:00:00.000Z"), 
        $lt: ISODate("2015-03-03T00:00:00.000Z") 
       } 
      } 
     }, 
     { 
      $project: {_id: 0, logtime: 1, outT: 1} 
     }, 
     { 
      $group: { 
       _id: { 
        day: {$dayOfYear: "$logtime"}, 
        hour: {$hour: "$logtime"} 
       }, 
       average: {$avg: "$outT"}, 
       max: {$max: "$outT"}, 
       min:{$min: "$outT"} 
      } 
     } 
    ] 
) 

, который производит:

{ "_id" : { "day" : 61, "hour" : 22 }, "average" : 3.1878750000000116, "max" : 3.44, "min" : 3 } 
{ "_id" : { "day" : 61, "hour" : 14 }, "average" : 13.979541666666638, "max" : 17.81, "min" : 8.81 } 
... 

Я хотел бы, чтобы произвести вывод, который выглядит как:

{"outT": { output from working aggregation above }, 
"inT1": { ... }, 
... 
} 

Все, что я пытаюсь, похоже, вызывает ошибку в консоли mongo. Может ли кто-нибудь помочь?

Благодаря

+0

Не могли бы вы, для завершения, также отправить сообщение об ошибке? – Bono

+0

Ясно, как грязь для меня, но вы, возможно, ищете «статистику» по вашему результату агрегации? И вернуть их вместе с результатом агрегации? –

ответ

1

Вы можете сделать это, в том числе каждый статистики в вашем $group с другим именем, а затем после этого с $project стадии, чтобы изменить его в нужный формат:

db.logs.aggregate([ 
    { 
     $match: { 
      logtime: { 
       $gte: ISODate("2015-02-28T00:00:00.000Z"), 
       $lt: ISODate("2015-03-03T00:00:00.000Z") 
      } 
     } 
    }, 
    { 
     $project: {_id: 0, logtime: 1, outT: 1, inT1: 1} 
    }, 
    { 
     $group: { 
      _id: { 
       day: {$dayOfYear: "$logtime"}, 
       hour: {$hour: "$logtime"} 
      }, 
      outT_average: {$avg: "$outT"}, 
      outT_max: {$max: "$outT"}, 
      outT_min:{$min: "$outT"}, 
      inT1_average: {$avg: "$inT1"}, 
      inT1_max: {$max: "$inT1"}, 
      inT1_min:{$min: "$inT1"} 
     } 
    }, 
    { 
     $project: { 
      outT: { 
       average: '$outT_average', 
       max: '$outT_max', 
       min: '$outT_min' 
      }, 
      inT1: { 
       average: '$inT1_average', 
       max: '$inT1_max', 
       min: '$inT1_min' 
      } 
     } 
    }   
]) 

Этом дает вам результат, который выглядит следующим образом:

{ 
    "_id" : { 
     "day" : 59, 
     "hour" : 21 
    }, 
    "outT" : { 
     "average" : 10.88, 
     "max" : 10.88, 
     "min" : 10.88 
    }, 
    "inT1" : { 
     "average" : 22.78, 
     "max" : 22.81, 
     "min" : 22.75 
    } 
} 
0

$ m ax в Mongodb получает максимум соответствующих значений из всех документов в коллекции. $ min получает минимальные значения из всех документов в коллекции. $ avg получает среднее значение из коллекции.

для примера можно пройти через Mongodb link.

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