以下名为" IgnitionData"在mongodb维持。在这里,我只展示文件的相关成员。
data: {[
{"_id":1, "ignition": 0,"date" : ISODate("2014-03-01T09:00:00Z")},
{"_id":2, "ignition": 1,"date" : ISODate("2014-03-01T09:01:00Z")},
{"_id":3, "ignition": 1,"date" : ISODate("2014-03-01T09:02:00Z")},
{"_id":4, "ignition": 1,"date" : ISODate("2014-04-01T09:03:00Z")},
{"_id":5, "ignition": 1,"date" : ISODate("2014-04-01T09:04:00Z")},
{"_id":6, "ignition": 0,"date" : ISODate("2014-04-01T09:05:00Z")},
{"_id":7, "ignition": 1,"date" : ISODate("2014-03-01T09:06:00Z")},
{"_id":8, "ignition": 1,"date" : ISODate("2014-03-01T09:07:00Z")},
{"_id":9, "ignition": 1,"date" : ISODate("2014-03-01T09:08:00Z")},
{"_id":10, "ignition": 1,"date" : ISODate("2014-04-01T09:09:00Z")},
{"_id":11, "ignition": 1,"date" : ISODate("2014-04-01T09:10:00Z")},
{"_id":12, "ignition": 0,"date" : ISODate("2014-04-01T09:11:00Z")}
}]
现在我需要生成一个报告,我只需要显示Ignition ON持续时间。我的输出应该如下所示
{
{"_id":1, "StartTime": ISODate("2014-03-01T09:01:00Z"), "StopTime": ISODate("2014-03-01T09:04:00Z"), "totalDurationInMin" : 3},
{"_id":2, "StartTime": ISODate("2014-03-01T09:06:00Z"), "StopTime": ISODate("2014-03-01T09:10:00Z"), "totalDurationInMin" : 4}
}
我可以获取任何列表变量的数据并运行循环。检查点火状态的转换(0到1和1到0)并计算总时间,但是如果可能的话,使用mongodb查询运算符将非常有帮助。这有时会涉及很多文档,因此使用变量将是昂贵的操作。
可能的Approch
var mapFunction = function(){ for( var i = 0; i < this.data.length; i++){
if ((this.data[i].ignition == "0") && (this.data[i+1].ignition == "1"))
{emit({StartDate: this.data[i].date});}
if ((this.data[i].ignition == "1" ) && (this.data[i+1].ignition == "0"))
{emit({EndDate: this.data[i].date});}
}};
var reduceFunction = function(key, values) { return values[1] - values[0]};
db.runCommand(
{
mapReduce: ignitionData,
map: mapFunction,
reduce: reduceFunction,
out: { merge: stoppageTime }
}
)
我仍然没有得到正确答案。有人请帮忙。
答案 0 :(得分:0)
我认为你可以在集合上尝试mongodb聚合。 首先根据id和date对集合进行排序,然后应用分组逻辑。类似的东西:
db.IgnitionData.aggregate(
[
{ $sort: { ignition: 1, date: 1 } },
{
$group:
{
_id: "$_id",
StartTime: { $first: "$date" },
StopTime: { $last: "$date" }
}
}
]
)