Robomongo, как использовать пользовательские функции?

Я пытаюсь использовать клиент mongodb "Robomongo" http://robomongo.org/

Он отлично работает, но я не понимаю, как получить доступ к функциям, созданным в разделе "функции"...

Я хочу проверить функциональность mapReduce, поэтому я создал функцию map() и reduce(), но когда я пишу в своей оболочке:

db.<name_of_collection>.mapReduce(map, reduce, {out: {inline: 1}});

Robomongo сообщит мне следующую ошибку:

ReferenceError: map is not defined (shell):1

Я также пробовал вот так:

db.<collection_name>.mapReduce(db.system.js.map, db.system.js.reduce, {out: {inline: 1}});

Но опять-таки что-то кажется неправильным...

uncaught exception: map reduce failed:{
    "errmsg" : "exception: JavaScript execution failed: ReferenceError: learn is not defined",
    "code" : 16722,
    "ok" : 0
}

Ответ 1

Доступ к хранимым функциям можно получить несколькими способами:

1)

db.collection.mapReduce(
    "function() { return map(); }", 
    "function(key, values) { return reduce(key, values); }",
    {out: {inline: 1}});

2)

db.collection.mapReduce(
    function() { return map(); }, 
    function(key, values) { return reduce(key, values); },
    {out: {inline: 1}});

Обратите внимание, что мы теперь используем функции, а не строки, как в 1)

3)

Если вы используете MongoDB 2.1 или выше, вы можете сделать:

db.loadServerScripts();
db.collection.mapReduce(
    map, 
    reduce,
    {out: {inline: 1}});    

Подробнее об этом: http://docs.mongodb.org/manual/tutorial/store-javascript-function-on-server/

Robomongo использует тот же движок, который используется оболочкой MongoDB. Ваши вопросы касаются MongoDB, а не Robomongo.

Ответ 2

После создания функции с помощью RoboMongo, в текстовом поле команды оболочки введите:

db.loadServerScripts();
myFunctionName();

и нажмите кнопку Execute на панели инструментов