2013-03-18 74 views
4

MongoDB的動態變量,我對MongoDB的MapReduce的node.js的路由器:中的MapReduce

app.get('/api/facets/:collection/:groupby', function(req, res) { 
    var collection = db.collection(req.params.collection); 
    var groupby = req.params.groupby; 
    var map = function() { 
     if (!this.region) { 
     return; 
     } 
     for (index in this.region) { 
     emit(this.region[index], 1); 
     } 
    } 
    var reduce = function(previous, current) { 
     var count = 0; 

     for (index in current) { 
     count += current[index]; 
     } 
     return count; 
    } 
    var options = {out: groupby + '_facets'}; 
    collection.mapReduce(map, reduce, options, function (err, collection) { 
    collection.find(function (err, cursor) { 
     cursor.toArray(function (err, results) { 
       res.send(results); 
      });    
    }) 
    }) 
}); 

這工作不錯。但我想用我的groupby參數。當我嘗試做這樣的事情:

var map = function() { 
    if (!this[groupby]) { 
      return; 
     } 
    for (index in this[groupby]) { 
      emit(this[groupby][index], 1); 
     } 
    } 

我收到TypeError: Cannot call method 'find' of undefined。有什麼辦法可以創建這樣的動態mapreduce函數嗎?

謝謝。

編輯:

哇!我自己做。只需將scope param傳遞給mapreduce參數,如scope:{keys: groupby},然後我就可以做var key = this[keys]裏面的map函數,並用key變量代替this.region。大!

+1

你應該發佈並接受你的答案。 – generalhenry 2013-03-18 22:42:15

+1

@generalhenry同意它將在未來幫助他人,請張貼答案並接受OP :) – Sammaye 2013-03-18 22:57:28

回答

3

哇!我自己解決了它。我只是將範圍參數傳遞給mapreduce參數。

scope:{keys: groupby} 

然後,我能夠做

var key = this[keys] 

地圖功能裏面和使用關鍵變量,而不是this.region。大!