我在哪里可以找到MongoDB map / reduce中使用的emit()函数实现?

时间:2013-02-07 08:17:00

标签: mongodb mapreduce emit

我正在尝试深入理解MongoDB中的map / reduce。

我认为实现这一目标的最佳方法是查看emit的实际实现。我在哪里可以找到它?

更好的只是emit()的简单实现。在MongoDB文档中,他们展示了一种通过编写自己来解决emit()问题的方法,但是他们提供的基本实现实际上太基础了。

我想了解分组是如何进行的。

2 个答案:

答案 0 :(得分:3)

我认为您正在寻找的定义位于此处:

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

要完全了解正在发生的事情,需要相当多的上下文。我承认,我没有。

答案 1 :(得分:0)

1.Mongo要求的JS版本不再是O.Powell的网址,已经死了。我找不到它了。

2.以下代码似乎是最感兴趣的片段。这个cpp函数switchMode计算要使用的emit函数。它目前在; https://github.com/mongodb/mongo/blob/master/src/mongo/db/commands/mr.cpp#L815

3.I我试图查看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 );
    }
}