Mongodb在PHP中每天获得平均值

时间:2015-09-24 19:01:15

标签: php mongodb aggregation-framework

我正在玩MongoDB,虽然我在互联网上看过与我类似的问题的帖子,但我找不到怎么做。

我的收藏中有一些文件包含传感器测量数据,如下所示:

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

当然,每个记录的时间戳,sensor_id和值都不同。

使用PHP我想获得PER传感器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可能会对此产生影响。它没有。

我已经阅读了有关Aggregration框架,SO和PHP网站的文档,但我无法找到如何做到这一点。请帮忙!

1 个答案:

答案 0 :(得分:3)

最后,我发现了如何获得我的示例的结果。 我正按照以下格式在日期上填写它们:

 $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)
    }
   ...