我想知道是否可以对MongoDb时间序列聚合进行平均。例如,一个汇总,给出每分钟的平均温度。
我的数据如下:
[
{
"_id": "57fbebf99929a71d305e2bb2",
"temp": 23.77,
"dateTime": "2016-10-10T19:28:57.923Z",
"_dateTime": 1476127737000
},
{
"_id": "57fbebfa9929a71d305e2bb3",
"temp": 27.16,
"dateTime": "2016-10-10T19:28:58.838Z",
"_dateTime": 1476127738000
},
{
"_id": "57fbebff9929a71d305e2bb4",
"temp": 31.93,
"dateTime": "2016-10-10T19:29:03.848Z",
"_dateTime": 1476127743000
}
]
到目前为止,代码(javascript)看起来像这样..
var results = temperatures.aggregate(
[
{ $project : { "timeSpan" : {$add : [new Date(0),"$_dateTime"] } } },
{ $project : { "minuteRead" : { $minute : "$timeSpan" }} },
{
$group : {
_id : {minuteRead : "$minuteRead" },
count : { $sum : 1 }
}
}
],
function(err, result) {
console.log(result);
}
);
输出:
[ { _id: { minuteRead: 30 }, count: 7 },
{ _id: { minuteRead: 29 }, count: 12 },
{ _id: { minuteRead: 28 }, count: 2 } ]
但我想拥有的是:
[ { _id: { minuteRead: 30 }, avgTemp: 17.6 },
{ _id: { minuteRead: 29 }, avgTemp: 18.3 },
{ _id: { minuteRead: 28 }, avgTemp: 20.1 } ]
这可能吗?
谢谢!
答案 0 :(得分:0)
" $ avg"会做的伎俩
$update_text= preg_replace_callback("/(<a[^>]*>)\s*(.*?)\s*(<\/a>)/s", function($match) {
$values = explode("\n",$match[2]);
foreach ($values as $value) {
$newmatch .= "\n\t".$value;
}
return $match[1].$newmatch."\n".$match[3];
}, $text);
答案 1 :(得分:0)
知道了!
temperatures.aggregate(
[
{ $project: { temp:'$temp', "timeSpan": { $add: [new Date(0), "$_dateTime"] } }},
{ $project: { "timestamp": { $minute: "$timeSpan" }, temp:'$temp' } },
{
$group: {
_id: { minuteRead: "$timestamp" },
avgTemp : { $avg :"$temp" }
}
}
],
function (err, result) {
if (err)
console.log("ERROR " + err);
else
console.log(result);
}
);