MongoDB在MapReduce中的动态变量



我有mongodb的node.js路由器:

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参数传递给mapreduce参数,如scope:{keys: groupby},然后我就可以在映射函数内执行var key = this[keys],并使用key变量代替this.region。太棒了!

哇!我自己解决的。我刚刚传递了一个作用域参数给mapreduce参数。

scope:{keys: groupby} 

然后我可以做

var key = this[keys] 

内部映射函数,并使用键变量代替this.region。太棒了!

相关内容

  • 没有找到相关文章

最新更新