Mongodb получает среднее значение за период времени в день в переполнении стека

Я играю с MongoDB и, хотя я видел сообщения в Интернете о проблемах, похожих на мою, но я не могу понять, как это сделать.

У меня есть довольно много документов в моей коллекции, которые хранят данные измерений датчика, как это:

{
'timestamp' => new MongoDate(1503119239, 0),
'sensor_id' => new MongoInt64(4),
'value' => 12345
}

Конечно же, отметка времени, sensor_id и значение различаются для каждой записи.

Используя PHP, я хочу получить средние значения PER на датчик в день / месяц / час.
Например, я попытался получить среднее значение за день, используя

$pipeline = array(
array(
'$group' => array(
'_id'      => ['sensor_id'=> '$sensor', '$dayOfYear'=>'$timestamp'],
'avgValue' => array( '$avg' => '$value' ),
),
),
);

$out = $logdataCollection->aggregate( $pipeline );

Я ожидаю, что это даст мне вывод, например,

[0] => ['sensor_id' => '1', 'dayOfYear'=>12, 'avgValue'=>1.123],
[1] => ['sensor_id' => '1', 'dayOfYear'=>13, 'avgValue'=>0.15],
[2] => ['sensor_id' => '2', 'dayOfYear'=>12, 'avgValue'=>1.123],
[3] => ['sensor_id' => '3', 'dayOfYear'=>15, 'avgValue'=>1.123],

и т.п.

В этом примере показано среднее значение по дням (за год), но я хочу, чтобы это можно было делать и за час, а также за месяц:

[0] => ['sensor_id' => '1', 'date'=>2015-01-01, 'avgValue'=>1.123],
[1] => ['sensor_id' => '1', 'date'=>2015-01-02, 'avgValue'=>0.15],
[2] => ['sensor_id' => '2', 'date'=>2015-01-01, 'avgValue'=>1.123],
[3] => ['sensor_id' => '3', 'date'=>2015-01-02, 'avgValue'=>1.123],

и т.п.

Сначала мои метки времени были просто числовыми, но я подумал, что их вставка как MongoDateTime, возможно, изменит это. Это не так.

Я прочитал документы об инфраструктуре Aggregation, SO и веб-сайте PHP, но я просто не могу понять, как это сделать. Пожалуйста помоги!

5

Решение

Наконец я узнал, как получить результаты для моих примеров.
Я собираю их в форматированную дату следующим образом:

 $pipeline = array(
array(
'$group' => array(
'_id'      => ['foundDate'=>['$dateToString'=>['format'=>'%Y-%m-%d', 'date'=>'$timestamp']], 'sensor'=>'$sensor'],
'avgValue' => array( '$avg' => '$value' ),
),
),
);

В котором я могу установить формат даты на что угодно, запрос будет сгруппирован по этому. Например, упомянутый код выведет:

[0]=>
array(2) {
["_id"]=>
array(2) {
["foundDate"]=>
string(10) "2016-03-23"["sensor"]=>
int(2)
}
["avgValue"]=>
float(526.622580645)
}
[1]=>
array(2) {
["_id"]=>
array(2) {
["foundDate"]=>
string(10) "2016-03-23"["sensor"]=>
int(3)
}
["avgValue"]=>
float(480.773846154)
}
...
3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector