MongoDBのmap/reduceで使用されるemit()関数の実装はどこにありますか?

私はMongoDBのmap/reduceについてより深く理解しようとしています。

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

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

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

2

2 答え

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

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

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

2
追加された
github.com/mongodb/mongo/ blob/master/src/third_party/js-1.7 /‌… これは、データベースjsランタイムが使用するバージョン
追加された 著者 JB.,
ええ、かなりのコンテキストが必要:) jsのバージョンを見つけるための任意のアイデア?
追加された 著者 O.Powell,
追加された 著者 O.Powell,

1.Mongoの必要なJSバージョンはもはやO.PowellのURLにありません。これは死んでいます。私はそれを見つける事が出来ません。

2.The below code seems to be the snippet of most interest. This cpp function, switchMode, computes the emit function to use. It is currently at; https://github.com/mongodb/mongo/blob/master/src/mongo/db/commands/mr.cpp#L815

3. emitに、_mrMapを介して発生すると思われる_idキーがデフォルトで含まれているかどうかを確認しようとしましたが、ここには示されていません。それ以外の場所では、空のマップである{}に初期化されます。

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 );
    }
}
0
追加された