如何执行mongodb备用分组

时间:2015-09-17 09:08:17

标签: mongodb mapreduce group-by aggregation-framework

我有一个dev_events集合,其中包含与设备相关的事件,事件具有类型和时间戳。可以使用不同的时间戳多次接收相同的事件类型。 我希望通过对每批event_type和计算日期差异进行分组来显示每个设备,event_type和event_duration(当事件开始时以及在开始新事件类型之前最后一次接收时)。因此,相同的event_type可能会在结果中多次出现,但与其他事件类型一起出现。

以下是我使用的示例代码:

db = connect("localhost:27017/dev");                

db.dev_events.insert({"device_id"   : 1, "event_type": 1, "event_timestamp" : new Date(2015,09,17,10,10,10)});
db.dev_events.insert({"device_id"   : 1, "event_type": 1, "event_timestamp" : new Date(2015,09,17,10,10,40)});
db.dev_events.insert({"device_id"   : 1, "event_type": 1, "event_timestamp" : new Date(2015,09,17,10,11,10)});

db.dev_events.insert({"device_id"   : 1, "event_type": 2, "event_timestamp" : new Date(2015,09,17,10,11,40)});
db.dev_events.insert({"device_id"   : 1, "event_type": 2, "event_timestamp" : new Date(2015,09,17,10,12,20)});
db.dev_events.insert({"device_id"   : 1, "event_type": 2, "event_timestamp" : new Date(2015,09,17,10,12,55)});

db.dev_events.insert({"device_id"   : 1, "event_type": 1, "event_timestamp" : new Date(2015,09,17,10,13,10)});
db.dev_events.insert({"device_id"   : 1, "event_type": 1, "event_timestamp" : new Date(2015,09,17,10,13,40)});
db.dev_events.insert({"device_id"   : 1, "event_type": 1, "event_timestamp" : new Date(2015,09,17,10,14,00)});

//map reduce
var map = function(){
  emit(this.event_type, this);
}

var reduce = function(key, values){
    var first_happen = values[0].event_timestamp.getTime();
    var last_happen = values[values.length-1].event_timestamp.getTime();

    var event_duration = last_happen - first_happen;
    return {event_type : key, duration : event_duration};
}

var res = db.dev_events.mapReduce(  
                        map, 
                        reduce, 
                        { 
                            query   : {"device_id" : 1},
                            sort    : {"event_timestamp" : 1},
                            out     : {inline : 1} 
                        }
            );

res.find({}).forEach(function(item){ 
    printjson(item); 
});
输出是:

{ "_id" : 1, "value" : { "event_type" : 1, "duration" : 230000 } }
{ "_id" : 2, "value" : { "event_type" : 2, "duration" : 75000 } }

当我期待event_type 1出现两次时。因为事件1发生了持续时间,所以事件2发生了第二个持续时间,然后事件1再次发生。

所以输出应该是这样的:

{ "_id" : 1, "value" : { "event_type" : 1, "duration" : xxx} }
{ "_id" : 2, "value" : { "event_type" : 2, "duration" : yyy } }
{ "_id" : 1, "value" : { "event_type" : 1, "duration" : zzz } }

其中xxx,yyy和zzz是事件的持续时间。

我感到困惑,我不知道它是否在mongoDB中可行。我以前在SQL存储过程中没有遇到任何问题。

非常感谢任何帮助,

此致

0 个答案:

没有答案