2011-06-17 3 views
0

я в настоящее время с помощью MapReduce MongoDB для генерации ежечасно объявлений количества просмотров, как это:Слияние 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 } } } 

Чтобы сделать это, я думаю, что я должен был бы быть в состоянии объединить два или более непересекающихся документы в моей Reduce операции, например:

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

Кто-нибудь знает, что может выглядеть такая операция сокращения, имея в виду, что имена браузеров не известны заранее?

ответ

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; 
}