2011-10-13 34 views
4

我想要逐步聚合的数据存在问题。MongoDB映射/通过自适应查询递增递减

设备(很多,存储设备集合中)发出的措施(不定期),其存储在记录收集在数据库中。 每条记录​​都有一个timestamp_utc,它不是存储数据的时间戳,而是测量的地方。 (完全不同,因为设备发送一堆措施)

我想要的是批量数据聚合(地图减少)以不同的比例为每个不同的设备递增。 例如,我想要一个平均每5分钟测量一次,每30分钟一次,...每天等的集合... 我不想每次处理整个数据,但只有新条目。

例:记录集合包含:

{ _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}}, 

在量程1数据汇总(每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}}, 

等每销售。 第一次生成这些数据当然不是什么大事,而且这是一种非常平常的映射/缩减操作。

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

问题出现在我想要做增量式地图缩减时。事实上,我想这样做STHG这样

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

的问题是,时间min为每个设备不同,它应该对应插入输出集合中的最后一项(通过time_utc排序)。

我已经尝试了很多技巧(使用插入时间...)。
有没有人知道我该如何处理它?
我想避免对每个设备进行一次mapreduce,因为它会太低。

回答

0

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

对于每个地图减少调用,我得到缩减集合中的最后一个处理时间戳,我调用map减少与基于插入时间戳的查询,以避免重复处理。

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