2

MongoDB での map/reduce の理解を深めようとしています。

これを達成する最善の方法は、emit の実際の実装を確認することだと思います。どこで見つけることができますか?

の単純な実装の方がさらに良いでしょうemit()。MongoDB のドキュメントでは、独自の記述によるトラブルシューティングの方法が示さemit()れていますが、それらが提供する基本的な実装は本当に基本的すぎます。

グループ化がどのように行われているかを理解したいと思います。

4

2 に答える 2

3

あなたが探している定義はここにあると思います:

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

何が起こっているのかを完全に理解するには、かなり多くのコンテキストが必要です。私は告白します、私はしません。

于 2013-02-07T09:01:27.170 に答える
0

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 );
    }
}
于 2014-03-17T18:22:46.963 に答える