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



我知道这可能很容易,但在过去的几个小时里,我一直在绞尽脑汁。我迷路了。我有一个集合,看起来像这样(每个文档结构是相同的)

{
   "_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
    }
}

Thanks in advance

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

似乎如果你有一个错误的代码(forEach() ' '),减少不执行。

相关内容

  • 没有找到相关文章

最新更新