2011-06-17 11 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 } } } 

それを行うには、私は例えば、私の削減運転中に2個以上のばらばらの文書をマージできるようにする必要があるだろうと思う:

{ _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; 
} 
関連する問題