我正在尝试更深入地了解 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 计算要使用的发射函数。它目前在; https://github.com/mongodb/mongo/blob/master/src/mongo/db/commands/mr.cpp#L815
3.我试图查看 emit 是否默认包含 _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 );
}
}