2013-02-07 27 views
2

我正試圖在MongoDB中更深入地理解map/reduce。我在哪裏可以找到在MongoDB的map/reduce中使用的emit()函數實現?

我想最好的方法來完成這個是看看排放的實際執行情況。我在哪裏可以找到它?

更好的只是一個簡單的實施emit()。在MongoDB文檔中,他們通過編寫自己的代碼來顯示排除emit()的方法,但是他們提供的基本實現過於簡單。我想了解這個分組是如何發生的。

回答

2

我認爲你正在尋找位於此處的定義:

https://github.com/mongodb/mongo/blob/master/src/mongo/db/commands/mr.cpp#L886

有相當雖然需要充分了解正在發生的事情有很多方面的。我承認,我沒有。

+0

是啊相當多的上下文需要:)任何想法在哪裏可以找到js版本? –

+0

找到它:https://github.com/mongodb/mongo/blob/master/src/mongo/shell/mr.js –

+0

https://github.com/mongodb/mongo/blob/master/src/third_party/ js-1.7/jsconfig.h#L44 我認爲這是數據庫js運行時使用的版本 –

0

1.Mongo所需的JS版本已不在O.Powell的URL中,它已經死亡。我找不到它。

2.下面的代碼似乎是最感興趣的代碼片段。此cpp函數switchMode計算要使用的emit函數。目前在; https://github.com/mongodb/mongo/blob/master/src/mongo/db/commands/mr.cpp#L815

3.我想看看是否有發射默認包含_id鍵,似乎通過_mrMap發生,這裏沒有顯示。在其他地方,它被初始化爲空的地圖。

void State::switchMode(bool jsMode) { 
    _jsMode = jsMode; 
    if (jsMode) { 
     // emit function that stays in JS 
     _scope->setFunction("emit", 
          "function(key, value) {" 
          " if (typeof(key) === 'object') {" 
          " _bailFromJS(key, value);" 
          " return;" 
          " }" 
          " ++_emitCt;" 
          " var map = _mrMap;" 
          " var list = map[key];" 
          " if (!list) {" 
          " ++_keyCt;" 
          " list = [];" 
          " map[key] = list;" 
          " }" 
          " else" 
          " ++_dupCt;" 
          " list.push(value);" 
          "}"); 
     _scope->injectNative("_bailFromJS", _bailFromJS, this); 
    } 
    else { 
     // emit now populates C++ map 
     _scope->injectNative("emit" , fast_emit, this); 
    } 
} 
相關問題