2013-01-11 61 views
2

我設置了一個蒙戈腳本由--eval採取的變量,就像這樣:與不確定的變量蒙戈工作外殼

mongo mydb myscript.js --eval "parameter = 'value'" 

不過,我希望腳本仍無需--eval工作。

如果這是基於瀏覽器的JS,我只是做了var internalParameter = window.parameter || null類的事情得到解決通過檢查未定義的變量拋出的ReferenceError,但mongo沒有window。是否可以通過Mongo腳本中的全局對象訪問變量,還是隻需要將其封裝在try/catch中?

回答

1

在myscript.js你可以這樣做:

var parameter = parameter || null; 

如果parameter通過--eval將有一個價值傳遞,否則這將是null

UPDATE

要做到這一點沒有定義輸入變量可以用事實this指的是全局對象的外殼做:

var internalParameter = this.parameter || null; 
+0

不,你不能。如果'parameter'未定義,則引用它會導致ReferenceError。 –

+0

@ StuartP.Bentley當我用2.2.2 mongo shell嘗試它時,它工作的很好。如果'parameter'未定義,那麼語句的'var parameter'部分將在評估其餘語句之前對其進行定義。 – JohnnyHK

+0

好吧,我想這是一個可能的解決方法 - 如果你做了'var parameter = parameter ||首先,它工作(可能是因爲變量聲明在賦值中計數)。我仍然很好奇,如果沒有定義輸入變量的方法(即'var differentParameterName = parameter || null')。 –

0

是。您的腳本可以設置這樣的默認:

var parameter = parameter || 'default'; 
print('parameter = ' + parameter); 

然後將有可能傳遞參數或保留默認:

% mongo script.js           
MongoDB shell version: 2.0.7 
connecting to: localhost:27017/test 
parameter = default 

% mongo script.js --eval "var parameter = 'something else';" 
MongoDB shell version: 2.0.7 
connecting to: localhost:27017/test 
parameter = something else 
3

現在,我已經學到了一些關於常見的JavaScript成語,我知道你也可以這樣做:

var internalParameter = typeof parameter == "undefined" ? null : parameter 
0

我做了以下解決了類似的問題:

function set_param(name, default_val) 
{ 
    if (typeof this[name] === "undefined") 
     this[name] = default_val; 
} 

set_param("DAYS_BACK", 180); 
set_param("BATCH_SIZE", 1000); 

現在,如果兩個參數中的任何一個參數都是--eval參數,則MongoDB shell將使用提供的參數。否則,它將使用第二個參數提供的默認值set_param()。無論是否使用--eval,一旦執行set_param(),名稱作爲set_param()的第一個參數給出的變量可以安全使用。