2012-04-11 3 views
47

Я использую Монго и файлы сценариев, как это:Как передать аргумент Монго Script

$ mongo getSimilar.js 

Я хотел бы передать аргумент в файл:

$ mongo getSimilar.js apples 

, а затем в файл сценария забирает аргумент, переданный в.

var arg = $1; 
print(arg); 

ответ

84

Используйте --eval и использовать сценарии оболочки, чтобы изменить команду, переданный в

mongo --eval "print('apples');"

Или делают глобальные переменные (кредитные, чтобы Тэд Маршалла):

$ cat addthem.js 
printjson(param1 + param2); 
$ ./mongo --nodb --quiet --eval "var param1=7, param2=8" addthem.js 
15 
+1

Это не работает с mapreduce, функция reduce() не имеет доступа к параметрам (ReferenceError: ... не определено рядом ...) – Thomas

+2

--eval очень полезен. скажем, мы хотим быстро изменить вторичный, чтобы стать первичными в наборе репликации. Используйте сценарий 'conf = rs.conf() conf.members.forEach ( function (member) { \t member.priority = 0.5 } ) conf.members [MemberID] .priority = 1 // rs.reconfig (конф) 'сохранить этот сценарий в chooseprimary.js и работать с' Монго --eval "вар MemberID = 3" chooseprimary. js'. memberId должен быть идентификатором вторичного, который вы хотите стать первичным. Просто выполняйте mongo -eval на Первичном сервере. :) – Willmore

+0

Это сработало, спасибо :) – Bastion

14

Вы не можете этого сделать, но вы можете поместить их в другой скрипт и загрузить сначала:

// vars.js 
msg = "apples"; 

и getSimilar.js был:

print(msg); 

Тогда:

$ mongo vars.js getSimilar.js 
MongoDB shell version: blah 
connecting to: test 
loading file: vars.js 
loading file: getSimilar.js 
apples 

Не совсем так удобно, хотя. .

+0

Awesome, спасибо за информацию! У меня есть несколько сценариев, которые были бы немного трудными для '-eval'. –

1

Установить оболочку вар:

password='bladiebla' 

Создать сценарий js:

cat <<EOT > mongo-create-user.js 
print('drop user admin'); 
db.dropUser('admin'); 
db.createUser({ 
user: 'admin', 
pwd: '${password}', 
roles: [ 'readWrite'] 
}); 
EOT 

Pass скрипт Монго:

mongo mongo-create-user.js 
+1

это не работает с 2.4. Можете ли вы указать на документацию или расширить ее? –

+1

это тоже не работает с 3.4, пожалуйста, разверните .. – singh1469

2

я использовал скрипт для трубы команду Монго в Монго. В команде Монго я использовал ARG я передаваемый в сценарий оболочки (т.е. я использовал $1):

#!/bin/sh 

objId=$1 
EVAL="db.account.find({\"_id\" : \"$objId\"})" 
echo $EVAL | mongo localhost:27718/balance_mgmt --quiet 
+0

Не должно быть 'find ({\" _ id \ ": ObjectId (\" $ objId \ ")})'? Или есть способ установить монго, чтобы вам не пришлось использовать 'ObjectId()' парень? – Bear

0

я написал небольшую утилиту, чтобы решить эту проблему для себя. С помощью утилиты mongoexec, вы могли бы выполнить команду ./getSimilar.js apples, добавив следующее в начало вашего скрипта:

#!/usr/bin/mongoexec --quiet 

В сценарии, вы можете получить доступ к аргументам как args[0].

https://github.com/pveierland/mongoexec

+0

Не работает; Я получаю доступ отрицательным. 'sudo' не делает этого трюка. Изменение shebang для указания на исполняемый файл, расположенный в каталоге пользователя (а не/usr/bin), не работает. Было все взволнованно использовать его. Хотел бы я заставить его работать. – Bear

+1

@Bear В инструкциях не упоминается, что сценарий должен быть исполняемым. Если вы запустите «sudo chmod + rx/usr/bin/mongoexec», он должен работать. – user764486

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