比较mongodb

时间:2017-04-02 16:53:17

标签: mongodb mongodb-query aggregation-framework

以下名为" 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 }
               }
             )

我仍然没有得到正确答案。有人请帮忙。

1 个答案:

答案 0 :(得分:0)

我认为你可以在集合上尝试mongodb聚合。 首先根据id和date对集合进行排序,然后应用分组逻辑。类似的东西:

db.IgnitionData.aggregate(
   [
     { $sort: { ignition: 1, date: 1 } },
     {
       $group:
         {
           _id: "$_id",
           StartTime: { $first: "$date" },
           StopTime: { $last: "$date" }
         }
     }
   ]
)