2014-12-01 53 views
1

我已經獲得了訪問特定頁面的文檔,基本上看起來像這樣(實際上有更多的數據點,但這應該得到點):試圖從MongoDB獲取總計和百分比(使用MapReduce)

[ 
    { 
    page: "home", 
    timeStamp: 1417457320 
    }, 
    { 
    page: "service", 
    timeStamp: 1417457323 
    }, 
    { 
    page: "service", 
    timeStamp: 1417457325 
    } 
] 

我想兩件事情報告:每個頁面的總數,每天的頁面瀏覽量,以及每天的總頁面視圖的每個頁面的百分比。我在尋找類似:

{ 
    date: 1417392000000, 
    page: "home", 
    visits: 123, 
    percentageOfTotalVisits: .3 
} 

文章(http://cookbook.mongodb.org/patterns/unique_items_map_reduce/)拉去總計很快,但我堅持試圖讓總的百分比。

謝謝!

回答

0

由於您的結果是在per day的基礎上,因此您需要group記錄由date。然後執行計算。該地圖,減少功能可以如下寫:

map功能:

  • 發出年份,月份和日期爲重點的組合。
  • 該值是頁面名稱。

日期,年份和日期信息是在發佈之前從時間戳中提取的。

var map = function(){ 
var date = new Date(this.timeStamp); 
var year = date.getYear(); 
var day = date.getDate(); 
var month = date.getMonth(); 
var key = day+""+month+""+year; 
emit(key,{"page":this.page}); 
} 

的減少功能:

  • 跟蹤爲特定的鍵獨特的頁數。
  • 一旦收集每頁計數,就會計算百分比。

result是按鍵返回的。

var reduce = function(id,obj){ 
    var result = {}; 
    var totalCount = 0; 
    for(var i=0;i<obj.length;i++) 
    { 
     if(result[obj[i].page]){ 
      result[obj[i].page].visits++; 
     } 
     else{ 
      result[obj[i].page] = {"visits":1,"percentageOfTotalVisits":0}; 
     } 
     totalCount++; 
    } 
    var keys = Object.keys(result); 
    for(var j=0;j<keys.length;j++) 
    { 
     result[keys[j]].percentageOfTotalVisits = 
          result[keys[j]].visits/totalCount; 
    } 
    return result; 
} 

調用集合的縮小比例。

db.collection.mapReduce(map,reduce,{out: "out"})  

樣品O/P:上db.out.find().pretty()

{ 
     "_id" : "17070", 
     "value" : { 
       "home" : { 
         "visits" : 1, 
         "percentageOfTotalVisits" : 0.3333333333333333 
       }, 
       "service" : { 
         "visits" : 2, 
         "percentageOfTotalVisits" : 0.6666666666666666 
       } 
     } 
}