4

私はmongodbmapreduce用の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このようにparamをmapreduce引数に渡すだけで、 map関数内で実行し、代わりに変数を使用するscope:{keys: groupby}ことができました。素晴らしい!var key = this[keys]keythis.region

4

1 に答える 1

3

わお!私はそれを自分で解決しました。スコープ パラメータを mapreduce 引数に渡しました。

scope:{keys: groupby} 

それから私はすることができました

var key = this[keys] 

map 関数内で、this.region の代わりにキー変数を使用します。すごい!

于 2013-03-19T10:01:44.130 に答える