2011-06-17 72 views
0

我目前正在使用MongoDB中的MapReduce产生这样的每小时广告观看次数:合并MongoDB的MapReduce的输出

{ _id : "4/1/2011 9:00 AM", value : { AdViews_Total : 4 } } 

这工作得很好,我也得到一个集合中的结果,我可以随后查询速度远远超过原始数据。现在,我想要做的是这样的:

{ _id : "4/1/2011 9:00 AM", value : { ByBrowser : { "Internet Explorer" : 4, "FireFox" : 4 } } } 

为了做到这一点,我想我需要能够在我减少操作合并两个或多个不相交的文件,例如:

{ _id : "4/1/2011 9:00 AM", value : { ByBrowser : { "FireFox" : 3 } } } 
{ _id : "4/1/2011 9:00 AM", value : { ByBrowser : { "FireFox" : 1 } } } 
{ _id : "4/1/2011 9:00 AM", value : { ByBrowser : { "Internet Explorer" : 4 } } } 

有没有人知道这样的Reduce操作可能是什么样子,请记住浏览器名称并不知道提前?

回答

1

在使用以下内容后,我已经设法实现了我的目标,尽管我怀疑可能有更有效的方法。我会留下这一天,然后标记为答案...

function Reduce(key, arr_values) { 
    var reduced = { 
     AdViews_Total : 0, 
     DefaultAdViews_Total : 0, 
     Sessions_Total : 0, 
     Browsers : [ ], 
     }; //a document 
    for(var i in arr_values) { 
     reduced.AdViews_Total += isNaN(arr_values[i].AdViews_Total) ? 0 : arr_values[i].AdViews_Total; 
     reduced.DefaultAdViews_Total += isNaN(arr_values[i].DefaultAdViews_Total) ? 0 : arr_values[i].DefaultAdViews_Total; 
     reduced.Sessions_Total += isNaN(arr_values[i].Sessions_Total) ? 0 : arr_values[i].Sessions_Total; 
     if (null != arr_values[i].Browsers) 
      for (var j in arr_values[i].Browsers) 
      { 
       var browser = arr_values[i].Browsers[j] 
       var browserLabel = browser.Browser; 
       var browserCount = browser.Count; 
       var browserFound = false; 
       for (var k in reduced.Browsers) 
       { 
        if (reduced.Browsers[k].Browser == browserLabel) 
        { 
         reduced.Browsers[k].Count += browserCount; 
         browserFound = true; 
        } 
       } 
       if (!browserFound) 
        reduced.Browsers[0] = browser; 
      } 
    } 
    return reduced; 
}