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 );
}
}