Слияние вывода MongoDB MapReduce - PullRequest
0 голосов
/ 17 июня 2011

В настоящее время я использую MapReduce MongoDB для создания почасовых просмотров объявлений, например:

{ _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 Ответ

1 голос
/ 17 июня 2011

Мне удалось достичь того, что я есть, после использования следующего, хотя я подозреваю, что может быть более эффективный способ сделать это.Я оставлю это на один день, прежде чем пометить как ответ ...

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