0

こんにちは私がやろうとしているのは、それぞれの個別のdepartmentTypeのカウントを取得することです。

fnMap = function() { 
  emit(this.departments.departmentType, {typeCount:1} ); 
} 

fnReduce = function(key, values) { 
  var result = {typeCount: 0}; 
  values.forEach(function(value) {
    result.typeCount += value.brandCount;
  });

  return result;             
};


var command = {
mapreduce : "clients", 
query     : {"departments.departmentType": {$exists: true}},
map       : fnMap.toString(), 
reduce    : fnReduce.toString(),    
    //sort: {"departments.departmentType":1}, 
    out: {inline: 1}   
};

mongoose.connection.db.executeDbCommand(command, function(err, dbres) {

    }); 

コマンドを実行すると、dbres.documents [0] .resultsには、departmentTypeの総数を含む1つのアイテムのみが含まれ、departmentTypeごとに1つのアイテムが含まれます。

私が間違っていることは何ですか?

また、SORT行のコメントを外すと、「dbアサーションの失敗:カーソルを作成できませんでした...」というエラーが表示され、フィールド名が正しく書き込まれていると思います。

4

2 に答える 2

5

Mongoose v3にModel.mapreduce()関数が追加されました(ドキュメントを参照)

示されている完全な例は次のとおりです。

var o = {};
o.map = function () { emit(this.name, 1) }
o.reduce = function (k, vals) { return vals.length }
o.out = { replace: 'createdCollectionNameForResults' }
o.verbose = true;
User.mapReduce(o, function (err, model, stats) {
  console.log('map reduce took %d ms', stats.processtime)
  model.find().where('value').gt(10).exec(function (err, docs) {
    console.log(docs);
  });
})

countの問題は、fnReduce()関数で、結果を配列に表示するのではなく、結果をサミットするためだと思います。

于 2012-10-05T10:23:04.453 に答える
0

次を使用できます。

db.clients.distinct("departments.departmentType")

これにより、すべての個別のdepartmentType値を含む配列が得られます。

map/reduceに2つの問題がありました。1つは、typeCountではなくreduceのbrandCountです。しかし、もっと重要なことは、部門の配列要素ごとに1回発行する必要がある場合に、ドキュメントごとに1回発行しようとしていることです。修正された(そしてわずかに単純化された)コード:

> fnMap = function () {
    this.departments.forEach(
       function (d) {
          emit(d.departmentType, 1);
       }
    );
}
> fnReduce = function (key, values) {
    var result = 0;
    values.forEach(
       function (value) {result += value;});
    return result;
}
于 2012-10-05T15:37:35.693 に答える