2012-12-04 53 views
0

我有以下佈局:MongoDB的MapReduce的報表生成

{ 
    "URL": "http://someurl.de", 
    "plugins": { 
     "HTTPServer": { 
      "os": [ 
       "FreeBSD" 
      ], 
      "string": [ 
       "Apache/2.2.21 (FreeBSD) mod_ssl/2.2.21 OpenSSL/0.9.8q DAV/2 PHP/5.3.8 with Suhosin-Patch" 
      ] 
     } 
    } 
} 

從中我想存儲在plugins.HTTPServer.string唯一項目的數量。所有的MapReduce例子只是指單層文件。據我瞭解的例子,你必須發射地圖功能中的數據(或選擇你想要提取的數據),然後使用reduce來進一步處理結果。我想我的問題是在映射階段 - 我需要訪問上面的字符串值:「Apache/2.2 ...」

因爲我只在MongoDB度過了最後一天,請原諒我的如果我沒有在這裏提出正確的問題,我就會無知。我是否朝着正確的方向前進?我知道我可以使用distinct = db.coll.distinct('plugins.HTTPServer.string'),但我想用MapReduce來完成這個任務。

map = function() { 
    server = this.plugins.HTTPServer.string 
    emit({server : this.server}, {count: 1}); 
} 

reduce = "function(key, values) { 
    var count = 0; 

    values.forEach(function(v) { 
    count += v['count']; 
    }); 

    return {count: count}; 
}" 

回答

1

你有幾個問題:

  1. map funtion的EMIT this.server應該只是server
  2. 在你的文檔中,"string"領域是一個數組,而不是一個單一的字符串,所以你正在發射陣列作爲你的鑰匙,這可能不是你想要的。
  3. 你在reduce函數中有流浪"個字符。

試試這個:

var map = function() { 
    if (this.plugins && this.plugins.HTTPServer && this.plugins.HTTPServer.string) { 
    this.plugins.HTTPServer.string.forEach(function(server) { 
     emit({server: server}, {count: 1}); 
    }); 
    } 
} 

var reduce = function(key, values) { 
    var count = 0; 

    values.forEach(function(v) { 
    count += v['count']; 
    }); 

    return {count: count}; 
} 
+0

謝謝,將會給它一個嘗試,並送還給你,貌似範圍的特異性是我錯過了 – EarlyPoster

+0

東西似乎仍然不對勁 - >週三01年12月5日: 01:47 [conn93] JS錯誤:TypeError:this.plugins.HTTPServer沒有任何屬性nofile_b:1 Wed Dec 5 01:01:47 [conn93] mr失敗,移除collection :: :: 9014 map invoke failed: JS錯誤:TypeError:this.plugins.HTTPServer沒有任何屬性nofile_b:1 – EarlyPoster

+0

即使嘗試以下語法:conks:this ['plugins.HTTPServer.string']沒有屬性 – EarlyPoster