2011-03-23 95 views
1

鑑於這樣的文件:的MongoDB的Map/Reduce鬥爭

{ "_id": { 
    "$oid": "4d88ca367d190a0aa4e27806" }, "Rows": [ 
    { 
     "Columns": { 
     "Date": "Tue, 02 Aug 2011 00:00:00 GMT -04:00", 
     "Col2": 33 
     "Col3": 44 
     } 
    }, 
    { 
     "Columns": { 
     "Date": "Mon, 17 Oct 2011 00:00:00 GMT -04:00", 
     "Col2": 55 
     "Col3": 66 
     } 
    } ], "DocName": "For My Eyes Only", "DocIdentifier": 3322445 } 

及以下的Map/Reduce函數:

function() { 
    this.Rows.forEach(function(bulkcol) { 
    emit(this.DocName, { TrendValue: bulkcol.Columns.Col2 }); 
    }); 
}; 

function(key, values) { 
    var sum = 0; 
    values.forEach(function(currTrend) { 
    sum += currTrend.TrendValue; 
    }); 
    return {DocName: key, TrendValue: sum}; 
}; 

我得到以下輸出:

{ 
    "_id": null, 
    "value": { 
    "DocName": null, 
    "TrendValue": 88 
    } 
} 

爲什麼是DocName null?

+0

鏈接就此問題向同樣在MongoDB論壇上:http://groups.google.com/group/mongodb-user/browse_thread/thread/44219c4994e51476 – AdaTheDev 2011-03-24 13:31:57

回答

0

如果我在看這個權利,我想我認爲,這個在emit函數中並不是你期望的那樣。

由於它在函數內部,所以這個引用了每一行,而不是父文檔。試試這個:

function() { 
    this = parent; 
    this.Rows.forEach(function(bulkcol) { 
    emit(parent.DocName, { TrendValue: bulkcol.Columns.Col2 }); 
    }); 
}; 
+0

你是不是指'var parent = this;'?那也行不通。它把我的TrendValue也設爲0! – ForeverLearning 2011-03-23 20:32:37

+0

這就是我的意思,是的。看看Kyle Banker的博客,他在mongo的map/reduce上有非常好的博客文章。我敢打賭,這是你錯過的一件小事。 – 2011-03-23 20:36:43

+0

關於Map/Reduce的事情無論我在哪裏閱讀的博客和文章總是有一些愚蠢的語法情況沒有被覆蓋到任何地方。儘管我讀過銀行家的博客。 – ForeverLearning 2011-03-23 20:39:04

1

問題是非常像Srdjan指出的 - 在你的forEach函數中,你實際上並沒有對父文檔的引用。

如果您改變了地圖功能,這一點,它的工作原理:

m = function() { 
    var docName = this.DocName; 
    this.Rows.forEach(function(bulkcol) { 
    emit(docName, { TrendValue: bulkcol.Columns.Col2 }); 
    }); 
}; 

因此,分配文檔名稱進入循環前一個變量,然後使用中它

+0

如果你可以幫助,感激..http://stackoverflow.com/questions/35426213/how-to-group-mongodb-mapreduce-output – user29578 2016-02-16 09:33:56