2013-01-11 7 views
2

Je suis la mise en place d'un script Mongo pour prendre des variables par --eval, comme ceci:Travailler avec des variables non définies à Mongo shell

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

Cependant, je veux que le script fonctionne toujours sans nécessiter l'--eval.

Si tel était JS basé sur un navigateur, je venais de faire une sorte de chose var internalParameter = window.parameter || null pour contourner le ReferenceError lancé en vérifiant une variable non définie, mais mongo n'a pas de window. Est-il possible d'accéder à des variables via l'objet global dans les scripts Mongo, ou dois-je simplement envelopper dans un try/catch?

Répondre

1

En MyScript.js vous pouvez faire:

var parameter = parameter || null; 

Si parameter est passé via le --eval il aura cette valeur, sinon il sera null.

MISE À JOUR

Pour le faire sans définir la variable d'entrée, vous pouvez utiliser le fait que this fait référence à l'objet global dans la coquille et à faire:

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

Non, vous ne pouvez pas. Si 'parameter' est indéfini, le référencer provoque une erreur ReferenceError. –

+0

@ StuartP.Bentley Cela a bien fonctionné quand je l'ai essayé avec la coque mongo 2.2.2. Si 'parameter' n'est pas défini, la partie' var parameter' de l'instruction le définit avant le reste de l'instruction en cours d'évaluation. – JohnnyHK

+0

Bon, je suppose que c'est une solution de contournement possible - si vous faites un paramètre var = paramètre || null' d'abord, cela fonctionne (probablement parce que la déclaration de variable compte dans l'assignation). Je suis toujours curieux de savoir s'il existe un moyen de le faire sans définir la variable d'entrée (ie 'var differentParameterName = paramètre || null'). –

0

Oui. Votre script peut définir une valeur par défaut comme ceci:

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

Et alors il serait possible de passer des paramètres ou laisser la valeur par défaut:

% 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

Maintenant que je l'ai appris un peu plus sur les idiomes JavaScript communs Je sais que vous pouvez faire:

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

je l'ai fait ce qui suit pour résoudre un problème similaire:

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

Maintenant, si l'un des paramètres est donné avec un argument --eval, le shell MongoDB utilisera ce qui a été fourni. Sinon, il utilisera la valeur par défaut fournie par le deuxième argument à set_param(). Les variables dont les noms ont été donnés en tant que premier argument à set_param() peuvent être utilisées en toute sécurité une fois que set_param() est exécuté, quelle que soit l'utilisation de --eval.

Questions connexes