2

Mongo は 2.0 で使い始めました。頻繁に実行するクエリの一部として、ジョブの実行時に他のコレクションからもデータをプルする map/reduce ジョブを実行します。

mongo 2.4 以降、この機能は削除されました ( http://docs.mongodb.org/manual/release-notes/2.4/#additional-limitations-for-map-reduce-and-where-operations )。 「コードをリファクタリングする」。

では、コードをリファクタリングする方法はありますか? 一般的な質問であることは承知していますが、一般的なアプリケーションを求めています。関連するコレクションとクロスクエリのサイズと用途には十分な多様性があります。

この時点で、dbオブジェクトをサーバー コード スコープに戻すだけのパッチを適用することもできます。次のパッチで十分なようです (はい、これらのセキュリティへの影響があることは理解していますが、シャードも使用していません。依存している機能を取り戻すための最も簡単な方法です):

diff --git a/src/mongo/db/commands/mr.cpp b/src/mongo/db/commands/mr.cpp
index 742392f..225a2b7 100644
--- a/src/mongo/db/commands/mr.cpp
+++ b/src/mongo/db/commands/mr.cpp
@@ -623,6 +623,7 @@ namespace mongo {
         void State::init() {
             // setup js
             _scope.reset(globalScriptEngine->getPooledScope( _config.dbname, "mapreduce" ).release() );
+            _scope->localConnect( _config.dbname.c_str() );

             if ( ! _config.scopeSetup.isEmpty() )
                 _scope->init( &_config.scopeSetup );
4

3 に答える 3

3

概念的には、MapReduce は入力ドキュメント セットと出力された値に対してのみ動作します。DB 操作の実行は、厳密に言えば MapReduce ジョブの範囲外です。この変更が行われた理由の詳細については、SERVER-8104およびSERVER-3130を参照してください。

そうは言っても、提供されたパッチは機能するはずですが、ロックの影響 (および前述のセキュリティの問題) があるため、使用しないように注意します。

過去のバージョンでこの機能を利用していた可能性のあるコードをリファクタリングする方法についての一般的な質問として、'reduce' 出力タイプを利用する複数の MapReduce ジョブを使用するという提案が 1 つ思い浮かびます。ここでは、増分 MapReduceのドキュメントが役立つ場合があります。

目標がサーバー側の実行である場合、別のオプションとして、MapReduce ロジックをスクリプトにリファクタリングし、 db.eval()を使用して実行できるようにすることもできます。問題の性質上、これはやや複雑な演習になる場合があります。

于 2013-05-02T23:02:23.977 に答える
2

2 つのコレクションに参加する必要性を説明しているようです。私は過去にこれを成功させ、data.gov と cia.gov からのテスト データを含む例をここに書きました。

http://tebros.com/2011/07/using-mongodb-mapreduce-to-join-2-collections/

このアプローチでは、次の 2 つの点に注意する必要があります。

  1. コレクション間の結合条件は、発行されたキーである必要があります。
  2. 排出される原稿の形状は同じでなければなりません。

次に、出力されたドキュメントをレデューサーで結合するだけです。この方法で行うと、シャード間で、場合によってはコア間でローカルに拡張することもできます ( https://jira.mongodb.org/browse/SERVER-4258を参照)。

于 2013-05-02T23:49:22.487 に答える