Frage

Ich verwende derzeit MapReduce von MongoDB, um stündliche Anzeigenanzahl wie folgt zu generieren:

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

Dies funktioniert einwandfrei und ich erhalte die Ergebnisse in einer Sammlung, die ich anschließend viel schneller als die Originaldaten abfragen kann.Was ich jetzt gerne machen würde, ist ungefähr so:

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

Dazu müsste ich in der Lage sein, zwei oder mehr nicht zusammenhängende Dokumente in meinem Reduzierungsvorgang zusammenzuführen, zum Beispiel:

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

Weiß jemand, wie eine solche Reduzierungsoperation aussehen könnte, wenn man bedenkt, dass die Browsernamen nicht im Voraus bekannt sind?

War es hilfreich?

Lösung

Ich habe es geschafft, das zu erreichen, was ich bin, nachdem ich Folgendes verwendet habe, obwohl ich vermute, dass es einen effizienteren Weg gibt, dies zu tun.Ich werde dies einen Tag lang stehen lassen, bevor ich es als Antwort markiere ...

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top