0

以下を含む「error_test.js」ファイルを用意しましょう。

db = db.getMongo().getDB( "mydb" );
db.mycol.insert( { hello : "world" } );


print("it is shown");
db.runCommand(
               {
                 mapReduce:  "mycol",
                 map:        function(){ print(not_exists); },
                 reduce:     function(key, values){},
                 out:        { replace: "myrescol" }
               }
             );
print("it is shown too (after error in mapreduce!)");

ファイルを (Windows コマンド ラインで) 実行すると、次のようになります。

mypath>mongo error_test.js
MongoDB shell version: 2.4.0
connecting to: test
it is shown
it is shown too (after error in mapreduce!)

mypath>echo %errorlevel%
0

mypath>

したがって、次のように推測できます。

  • mapreduce エラーは実行を停止しません。
  • mapreduce エラーはユーザーに表示されません。
  • mapreduce エラーは終了コード (0 = 成功) に変換されません (したがって、呼び出し元プログラムはエラーを検出できません)。

エラーを知る唯一の方法は、「mongod.log」で次の行を探すことです。

Wed Jun 12 10:02:37.393 [conn14] JavaScript execution failed: ReferenceError: not_exists is not defined near '(){ print(not_exists)'

Java で「db.doEval(my_js)」メソッドを使用し、「error_test.js」ファイルの内容を「my_js」変数に入れると、同じことが起こります: mapreduce エラーは検出されません (例外は起動されず、null はありません)値が返された場合、「ok : 1.0」が応答に表示されます)。

だから私の質問は: mapreduce でエラーを検出するにはどうすればよいですか? (js ファイルと doEval() メソッドの両方)

ありがとうございました

4

1 に答える 1

0

返されたドキュメントを変数にキャプチャし、スクリプトでdb.runCommand()そのok値を確認する必要があります。その後、エラーをスローしたり、出力を出力したりできます。

print("it is shown");
var res = db.runCommand(
               {
                 mapReduce:  "mycol",
                 map:        function(){ print(not_exists); },
                 reduce:     function(key, values){},
                 out:        { replace: "myrescol" }
               }
             );
printjson(res);
if (res.ok == 0) {
   print("Oopsy!");
   throw("error! " + res.errmsg + " returned from mapreduce");
}
print("it is shown too (after error in mapreduce!)");
于 2013-06-12T15:50:16.787 に答える