我想将名为file_path的环境变量传递给js文件。 我使用以下语法 mongo --eval“var file_path ='$ file_path'”< aggregation.js
输出: MongoDB shell版本:3.2.9-rc0 连接到:测试
注意: 它不执行aggregation.js文件。 只有它通过论证。
答案 0 :(得分:9)
这对我有用:
mongo --eval "var my_var = '$MY_VAR'" my_script.js
忽略<
。 mongo
将处理命令行上的任何剩余参数作为要执行/解释的文件,但显然将shell输入重定向与--eval
组合会导致javascript命名空间被重置。
我假设但无法确认这是因为作为参数传递的文件名是通过load()
机制处理的,根据https://docs.mongodb.com/v3.2/reference/method/load/,该机制的行为如下:
使用load()执行文件后,您可以引用从mongo shell环境定义文件的任何函数或变量。
答案 1 :(得分:5)
根据 this commit 的说法,似乎有一个名为 _getEnv()
的本机方法可以为您完成此操作。
const username = _getEnv('DB_USERNAME')
const password = _getEnv('DB_PASSWORD')
// use the username and password
答案 2 :(得分:4)
自Mongo 4.0.5
起,可以使用一些新的管理功能来加载文本文件和执行程序。
因此,您可以编写Javascript函数来执行提供环境变量值的Shell脚本:
function getEnvValue(envVar, defVal) {
var ret= run("sh", "-c", `printenv ${envVar} >/tmp/${envVar}.txt`);
if (ret != 0) return defVal;
return cat(`/tmp/${envVar}.txt`)
}
然后像这样使用它:
db.createCollection("myCol",
{ capped: true,
size: getEnvValue('MYCOL_MAX_SIZE_GB', 2)*1024*1024*1024
});
这取决于主机外壳,但在我的情况下(Docker)是可以接受的。
还尝试直接阅读environ
:
cat('/proc/self/environ').split('\0') # Doesn't work
,但它仅获取第一个变量。我猜是因为空字符...
答案 3 :(得分:0)
蒙哥change request有一个建议:
alias mongo="export | sed 's/declare -x /env./' > shell.js; mongo $@; rm shell.js;"
然后在~/mongorc.js
中输入
var env = {};
load('shell.js');
答案 4 :(得分:0)
同时已添加了本机方法shellGetEnv()
,请参见MongoDB GitHub
所以,这很简单
shellGetEnv("file_path")
但是,该方法没有记录,并且看起来无法从Mongo shell访问。也许它会在将来的版本中提供。