gpt4 book ai didi

PHP、MongoDB 和使用 MapReduce 或聚合框架的电力监控

转载 作者:可可西里 更新时间:2023-11-01 09:52:56 24 4
gpt4 key购买 nike

我目前正在以不同的时间间隔(1 到 5 秒之间)将功率测量值(瓦特)记录到我的 MongoDB 2.2(db -> monitoring -> kWh)。我的集合中的数据打包如下。

{
"_id":ObjectId("5060c134f05e888e03000001"),
"reading":"power",
"watts":"549.",
"datetime":1348518196
}

我需要聚合信息到小时,因此从一开始就将所有瓦特相加到最后一小时的时间,然后除以该小时内的读数数。我需要能够通过 PHP 将此结果推送到 MongoDB 中的新集合。这当然可以作为 cron 运行。工作,但是是否有一种机制可以将其作为插入的一部分执行?

日期时间字段是一个 Unix 时间戳。

最佳答案

您可以使用 MR 的 emit 函数轻松做到这一点,例如:

function(){
emit(hour, {count: this.watts});
}

hour 变量将是处理行的时间的规范化小时(如下面我的 PHP 代码片段所示),使用如下所示的方法:convert date to timestamp in javascript?或者您可以从 mktime() 的 PHP cronjob 中传入一个外部变量。

做一个非常简单的 reduce 来对它们求和,然后对 merge 进行 out 到从调用 MR 的 PHP cronjob 运行的主要每小时聚合集合。

然而,这对于这类事情来说似乎有点矫枉过正,就我个人而言,我会直接在 PHP 中这样做:

$cursor = $db->collection->find(array('datetime' => array('$gte' => time()-3600)));
$sumWatts = 0;
foreach($cursor as $_id => $row){
$sumWatts += $row['watts'];
}
$db->otherCollection->insert(array('sum' => $sumWatts, 'hour' => mktime(date('H'), 0, 0))));

这会将所有行的小时标准化为处理时的整小时。

虽然您也可以使用聚合框架使用 $sum 运算符来完成此操作,将其读入 PHP,然后将其写出。

不过,我认为对于这种特定类型的聚合,在这段时间内,对于这种单一字段,直接 PHP 可能更简单、更容易,甚至可能更快。

如果您要聚合大量数据和许多字段,那么我会说在 MR 中执行此操作,它可以超时运行等。

关于PHP、MongoDB 和使用 MapReduce 或聚合框架的电力监控,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12702732/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com