MongoDB使用自适应查询逐步减少Map / Reduce

时间:2011-10-13 10:00:12

标签: mongodb mapreduce

我想要逐步汇总的数据存在问题。

我有设备(很多,存储在设备集合中),它会发出存储在记录集合中的数据库中的度量(非常规)。 每条记录都有一个timestamp_utc,它不是存储数据的时间戳,而是测量的位置。 (完全不同,因为设备发送了一堆措施)

我想要的是以递增方式为每个不同的设备批量数据聚合(Map Reduce)。 例如,我想要一个平均每5分钟测量一次的集合,每30分钟一次,每天......等等... 我不想每次都处理整个数据,只需要新的条目。

Ex:记录集包含:

{ _id : {device1, time : ISODate(2011-10-12T13:50:01Z)}, value : { meas1 : 2, meas2 : 4}},
{ _id : {device1, time : ISODate(2011-10-12T13:51:01Z)}, value : { meas1 : 1, meas2 : 6}},
{ _id : {device2, time : ISODate(2011-10-12T13:49:01Z)}, value : { meas1 : 3, meas2 : 7}},
{ _id : {device2, time : ISODate(2011-10-12T13:50:01Z)}, value : { meas1 : 4, meas2 : 8}},
{ _id : {device2, time : ISODate(2011-10-12T13:51:01Z)}, value : { meas1 : 5, meas2 : 9}},

在scale1上进行数据聚合(每5分钟)后,我会有类似

的内容
{ _id : {device1, time : ISODate(2011-10-12T13:50:00Z)}, value : { meas1 : 1.5, meas2 : 5}},
{ _id : {device2, time : ISODate(2011-10-12T13:45:00Z)}, value : { meas1 : 3, meas2 : 7}},
{ _id : {device2, time : ISODate(2011-10-12T13:50:00Z)}, value : { meas1 : 4.5, meas2 : 8.5}},

等每次促销。 第一次生成这些数据自然不是什么大问题,这是一种非常常见的map / reduce操作。

db.record.mapReduce(map, reduce, {finalize : finalize, out :  { merge : db.recordscale1 }});

当我想要增量地图缩减时出现问题。的确,我想做这样的事情

db.record.mapReduce(map, reduce, {query : { "_id.time_utc" : { $gte : timeMin } }, finalize : finalize, out :  { merge : db.recordscale1 }});

问题是timeMin对于每个设备是不同的,它应该对应于插入输出集合中的最后一个条目(按time_utc排序)。

我尝试了很多技术失败(使用insertion_time ...) 有谁知道如何处理它? 我想避免为每个设备做一个mapreduce,因为它太低了。

1 个答案:

答案 0 :(得分:0)

我最后添加了一个带有插入时间戳的新字段。

对于每个map reduce调用,我得到简化集合中的最后一个处理时间戳,我使用基于插入时间戳的查询调用map reduce,以避免重复处理。

如果有人有更好的主意,我会感兴趣; - )