- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我目前正在以不同的时间间隔(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/
我有一个计算字段,其格式指定如下 - #,##0.00;[RED](#,##0.00);# 所谓格式,我指的是我们可以从计算字段的属性(在格式选项卡中)设置的格式值。 这个格式是什么意思? 最佳答案
我是一名优秀的程序员,十分优秀!