0

您好,我要做的就是获取每个不同部门类型的计数:

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 仅包含一项具有部门类型总数的项,而不是每个部门类型一项及其计数的多项。

任何想法我做错了什么?

此外,当我取消注释 SORT 行时,我收到错误“db assertion failure: could not create cursor over...”,我相信字段名称写正确。

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")

这将给出一个包含所有不同部门类型值的数组。

你的 map/reduce 有两个问题。一种是reduce 中的brandCount 而不是typeCount。但更重要的是,当您需要为每个部门数组元素发出一次时,您会尝试为每个文档发出一次。更正(并略微简化)的代码:

> 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 回答