简单的MongoDB MR没有产生预期的结果

时间:2014-07-04 11:13:13

标签: javascript mongodb mapreduce

我知道这可能是一件容易的事,但不管怎样,但是过去几个小时我一直在喋喋不休。我搞不清楚了。我有一个看起来像这样的集合(每个文档结构是相同的)

{
   "_id": "736722976",
   "value": {
     "tag_cloud": {
       "0": {
         "0": "FIFA World Cup 2014",
         "1": " Germany",
         "2": " Algeria",
         "3": " Thomas Muller",
         "4": " Mesut Ozil"
      },
       "1": {
         "0": "Monsoon",
         "1": " Germany"
      }
    }
  }
}

现在,我正在尝试运行map-reduce来生成云中出现的每个标签的总数。这就是我的mr代码的样子

var map = function(){
  emit(this._id, this.value.tag_cloud);
}

var reduce = function(key, values){
    var mm = new Array();
    values.forEach(function(v){
        for (i in v){
            k = v[i].trim();
            if (k in mm){
                mm[k] = mm[k] + 1;
            }else{
                mm[k] = 1;
            }
        }
    });
    return {tag: mm};
}

db.analysis_mid.mapReduce(map, reduce, 
        {
            out: "analysis_result"
        }
);

我正在运行这个---

mongo localhost:27017/my_db_name_with_mother_collection mr.js

它运行得很好。没有任何错误。但是,它产生的结果看起来像这样---

{
   "_id": "736722976",
   "value": {
     "0": {
       "0": "FIFA World Cup 2014",
       "1": " Germany",
       "2": " Algeria",
       "3": " Thomas Muller",
       "4": " Mesut Ozil"
    },
     "1": {
       "0": "Monsoon",
       "1": " Germany"
    }
  }
}

我不知道这怎么可能。我在这里错过了什么?有人可以帮帮我吗?

所需的输出应为---

{ 
    "_id": "736722976",
    "tag": {
        "FIFA World Cup 2014": 1,
        "Germany": 2,
        "Algeria": 1,
        "Thomas Muller": 1,
        "Mesut Ozil": 1,
        "Monsoon": 1
    }
}

提前致谢

1 个答案:

答案 0 :(得分:1)

我看到不同的错误,首先,mm是一个对象,而不是一个数组(你需要一个字符串键),其次,你不能在一个对象中应用forEach()(发出的值)地图),你必须做一个for循环。

如果代码中有错误(forEach()``),则不会执行reduce。