Zusammenführen der MongoDB MapReduce-Ausgabe
-
28-10-2019 - |
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?
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;
}