2013-06-12 2 views
0

Давайте есть файл "error_test.js", который содержит:Как обнаружить ошибку в MapReduce

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)' 

То же самое происходит, если мы используем «db.doEval (my_js)» метод в Java, и мы помещаем содержимое файла «error_test.js» в переменную «my_js»: Ошибка отображения карты не обнаружена (исключение excepcion не возвращается, не возвращается нулевое значение, «ok: 1.0» появляется в ответе).

Так что мой вопрос: как я могу обнаружить ошибку в mapreduce? (Как в файле JS и в методе doEval())

Спасибо

ответ

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!)"); 
+0

вы можете поместить это в попытке поймать блока или делать все, что вы хотите, когда вы обнаружили ошибку - в том числе возвращения код ошибки ... –

+0

Спасибо, это работает. Я не знал, что «db.runCommand()» возвращает значение (json doc). Фактически, я вижу, что на приведенных ниже страницах руководства нет упоминания о возвращаемом значении: 1) db.runCommand(): http://docs.mongodb.org/manual/reference/method/ db.runCommand/ 2) mongo Shell Methods: http://docs.mongodb.org/manual/reference/method/ Возможно, есть упоминание на некоторых других страницах, но я их не нашел. Если какой-либо веб-редактор mongo читает этот комментарий, добавьте некоторую информацию о возвращаемом значении на эти страницы. спасибо – freesoft

Смежные вопросы