我知道这可能是一件容易的事,但不管怎样,但是过去几个小时我一直在喋喋不休。我搞不清楚了。我有一个看起来像这样的集合(每个文档结构是相同的)
{
"_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
}
}
提前致谢
答案 0 :(得分:1)
我看到不同的错误,首先,mm
是一个对象,而不是一个数组(你需要一个字符串键),其次,你不能在一个对象中应用forEach()
(发出的值)地图),你必须做一个for循环。
如果代码中有错误(forEach()``),则不会执行reduce。