[英]Mongodb get average value over period of time per day in PHP
我正在玩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網站的文檔,但我無法找到如何做到這一點。 請幫忙!
最后,我發現了如何獲得我的示例的結果。 我正在按照以下格式化日期:
$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)
}
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.