我正試圖在MongoDB中更深入地理解map/reduce。我在哪裏可以找到在MongoDB的map/reduce中使用的emit()函數實現?
我想最好的方法來完成這個是看看排放的實際執行情況。我在哪裏可以找到它?
更好的只是一個簡單的實施emit()
。在MongoDB文檔中,他們通過編寫自己的代碼來顯示排除emit()
的方法,但是他們提供的基本實現過於簡單。我想了解這個分組是如何發生的。
我正試圖在MongoDB中更深入地理解map/reduce。我在哪裏可以找到在MongoDB的map/reduce中使用的emit()函數實現?
我想最好的方法來完成這個是看看排放的實際執行情況。我在哪裏可以找到它?
更好的只是一個簡單的實施emit()
。在MongoDB文檔中,他們通過編寫自己的代碼來顯示排除emit()
的方法,但是他們提供的基本實現過於簡單。我想了解這個分組是如何發生的。
我認爲你正在尋找位於此處的定義:
https://github.com/mongodb/mongo/blob/master/src/mongo/db/commands/mr.cpp#L886
有相當雖然需要充分了解正在發生的事情有很多方面的。我承認,我沒有。
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);
}
}
是啊相當多的上下文需要:)任何想法在哪裏可以找到js版本? –
找到它:https://github.com/mongodb/mongo/blob/master/src/mongo/shell/mr.js –
https://github.com/mongodb/mongo/blob/master/src/third_party/ js-1.7/jsconfig.h#L44 我認爲這是數據庫js運行時使用的版本 –