2013-04-26 23 views
0

我有「統計」收集這樣的:使用地圖縮小統計收集中的所有文檔?

{ "_id" : ObjectId("4d2407265ff08824e3000001"), "request_uri" : {"netloc":"localhost/8080", "path":"vi/sitelicense"}, "api_key" : "apikey", "request_method" : "POST" } 
    { "_id" : ObjectId("4d2551b4ae9fa739640df821"), "request_uri" : {"netloc":"localhost/8080", "path":"vi/sitelicense"}, "api_key" : "apikey", "request_method" : "GET" } 
    { "_id" : ObjectId("4d255b115ff08821c2000001"), "request_uri" : {"netloc":"localhost/8080", "path":"vi/sitelicense"}, "api_key" : "apikey", "request_method" : "POST" } 
    { "_id" : ObjectId("4d25e8d55ff08814f8000001"), "request_uri" : {"netloc":"localhost/8080", "path":"vi/sitelicense"}, "api_key" : "apikey", "request_method" : "PUT" } 
    { "_id" : ObjectId("4d2407265ff08824e3700001"), "request_uri" : {"netloc":"localhost/8080", "path":"vi/sitelicense"}, "api_key" : "apikey", "request_method" : "POST" } 

我怎樣才能找到我的「統計」的文件總數收集使用映射精簡操作? 這裏是我的地圖減少操作:

map_number_api_calls = function() { 
    emit(this._id, 1); 
} 
reduce_number_api_call = function(k, v) { 
    var i, sum = 0; 
    for (i in v) { 
    sum += v[i]; 
    } 
    return sum; 
} 

但上面的地圖,減少操作沒有返回的文檔總數。我需要收集文件的總數,實際上是5.任何示例?

+1

使用map/reduce很容易,但爲什麼要使用map/reduce而不僅僅是db.collection.count()? – 2013-04-26 14:58:37

+0

我必須從同一集合中執行一些其他數據聚合,因此我必須使用map/reduce操作來完成此操作。是否可以安排我的地圖縮小操作?正如你可以看到我的集合中有一些api調用數據,我必須找到分析並將其更新到其他集合? – 2013-04-27 05:49:37

回答

4

的原因,你的map/reduce不工作是你發出的對值從地圖必須包括兩件事情:

1. Key over which you want to aggregate values 
2. Value 

你的鑰匙應該是一個常數 - 即你想要聚合在整個集合中,所以您需要將所有發射值映射到相同的密鑰。

更換emit(this._id, 1)emit(null, 1),它會工作(它沒有成爲null它可能是1或`「收藏」字符串文字或其他任何常數)。

除非您將此練習作爲學習map/reduce的練習,否則我會建議使用db.collection.count()來獲取集合中項目的數量。

+0

完美!它爲我工作。有關計劃map-reduce操作以根據「統計」集合計算每日,每週和每月分析的任何想法? – 2013-04-27 06:17:01

+0

您可以通過shell腳本通過crontab運行它,或者您可以使用適當的MongoDB驅動程序以您喜歡的腳本語言編寫程序來調用mapreduce。 – 2013-04-28 00:13:49

相關問題