如何将环境变量传递给mongo脚本

时间:2016-09-12 06:29:09

标签: mongodb shell

我想将名为file_path的环境变量传递给js文件。 我使用以下语法 mongo --eval“var file_path ='$ file_path'”< aggregation.js

输出: MongoDB shell版本:3.2.9-rc0 连接到:测试

注意: 它不执行aggregation.js文件。 只有它通过论证。

5 个答案:

答案 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访问。也许它会在将来的版本中提供。