我知道这可能很容易,但在过去的几个小时里,我一直在绞尽脑汁。我迷路了。我有一个集合,看起来像这样(每个文档结构是相同的)
{
"_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() ' '),减少不执行。