Jel*_*eij 5 php mongodb aggregation-framework
我正在玩MongoDB,虽然我在互联网上看过与我类似的问题,但我不知道该怎么做.
我的收藏中有一些文件包含传感器测量数据,如下所示:
{
'timestamp' => new MongoDate(1503119239, 0),
'sensor_id' => new MongoInt64(4),
'value' => 12345
}
Run Code Online (Sandbox Code Playgroud)
当然,每个记录的时间戳,sensor_id和值都不同.
使用PHP我想获得PER传感器PER日/月/小时的平均值.例如,我试过通过使用获得平均每天
$pipeline = array(
array(
'$group' => array(
'_id' => ['sensor_id'=> '$sensor', '$dayOfYear'=>'$timestamp'],
'avgValue' => array( '$avg' => '$value' ),
),
),
);
$out = $logdataCollection->aggregate( $pipeline );
Run Code Online (Sandbox Code Playgroud)
例如,我希望它能给我一个输出
[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],
Run Code Online (Sandbox Code Playgroud)
等等
此示例显示了按天计算的平均值(在一年中),但我希望能够在一个月内每小时执行此操作:
[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],
Run Code Online (Sandbox Code Playgroud)
等等
起初我的时间戳只是数字,但我认为将它们插入MongoDateTime可能会对此产生影响.它没有.
我已经阅读了关于Aggregration框架,SO和PHP网站的文档,但我无法找到如何做到这一点.请帮忙!
最后我找到了如何获取示例的结果。我将它们按格式化日期分组,如下所示:
$pipeline = array(
array(
'$group' => array(
'_id' => ['foundDate'=>['$dateToString'=>['format'=>'%Y-%m-%d', 'date'=>'$timestamp']], 'sensor'=>'$sensor'],
'avgValue' => array( '$avg' => '$value' ),
),
),
);
Run Code Online (Sandbox Code Playgroud)
我可以将日期格式设置为任何内容,查询将对此进行分组。例如,上述代码将输出:
[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)
}
...
Run Code Online (Sandbox Code Playgroud)