我想把名为file_path的环境变量传递给js文件。我使用以下语法:
file_path
mongo --eval "var file_path='$file_path'" < aggregation.js
输出:
MongoDB shell version: 3.2.9-rc0 connecting to: test
注:
它不执行aggregation.js文件,只传递参数。
aggregation.js
r1zhe5dt1#
这对我很有效:
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()执行文件后,可以从mongoshell环境引用该文件定义的任何函数或变量。
<
mongo
--eval
load()
djp7away2#
根据这个提交,似乎有一个名为_getEnv()的原生方法可以为您完成此操作。
_getEnv()
const username = _getEnv('DB_USERNAME') const password = _getEnv('DB_PASSWORD') // use the username and password
2w2cym1i3#
自从Mongo 4.0.5以来,可以使用一些新的管理函数来加载文本文件和执行程序,因此您可以编写一个Javascript函数来执行提供环境变量值的shell脚本:
4.0.5
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 });
这依赖于主机shell,但在我的情况下(Docker)是可以接受的。还尝试直接读取environ:
environ
cat('/proc/self/environ').split('\0') # Doesn't work
但它只得到第一个变量我猜是因为空字符的缘故...
35g0bw714#
看起来本地方法shellGetEnv()同时被添加,请参见MongoDB GitHub函数可用(感谢@orgads):
shellGetEnv()
_getEnv("PATH")
但是,它没有文档记录,并且存在no statement yet,无论它是否可由最终用户使用或仅作为内部命令使用。新的MongoDB Shell mongosh是一个功能齐全的JavaScript和Node.js 14.x REPL环境,因此您可以使用process.env访问环境变量,例如
mongosh
process.env
process.env["PATH"]
kxe2p93d5#
mongo change request给出了一个建议:
alias mongo="export | sed 's/declare -x /env./' > shell.js; mongo $@; rm shell.js;"
然后在~/mongorc.js中:
~/mongorc.js
var env = {}; load('shell.js');
pdsfdshx6#
如果是Mongo 6,则使用process.env:
$ export A='a"a' $ mongosh --quiet --eval 'console.log(process.env.A)' a"a
在6.x之前:
$ q_A=`jq --arg v "$A" -n '$v'` $ mongosh --quiet --eval "console.log($q_A)" a"a
顺便说一下,mongo映像(docker)附带了jq,尽管这可能会改变。
docker
jq
6条答案
按热度按时间r1zhe5dt1#
这对我很有效:
忽略
<
。mongo
会将命令行上的任何剩余参数作为要执行/解释的文件处理,但显然,将shell输入重定向与--eval
结合使用会导致javascript名称空间被重置。我假设但不能确认这是因为作为参数传递的文件名是通过
load()
机制处理的,根据https://docs.mongodb.com/v3.2/reference/method/load/,该机制的行为如下:用load()执行文件后,可以从mongoshell环境引用该文件定义的任何函数或变量。
djp7away2#
根据这个提交,似乎有一个名为
_getEnv()
的原生方法可以为您完成此操作。2w2cym1i3#
自从Mongo
4.0.5
以来,可以使用一些新的管理函数来加载文本文件和执行程序,因此您可以编写一个Javascript函数来执行提供环境变量值的shell脚本:然后像这样使用它:
这依赖于主机shell,但在我的情况下(Docker)是可以接受的。
还尝试直接读取
environ
:但它只得到第一个变量我猜是因为空字符的缘故...
35g0bw714#
看起来本地方法
shellGetEnv()
同时被添加,请参见MongoDB GitHub函数可用(感谢@orgads):
但是,它没有文档记录,并且存在no statement yet,无论它是否可由最终用户使用或仅作为内部命令使用。
新的MongoDB Shell
mongosh
是一个功能齐全的JavaScript和Node.js 14.x REPL环境,因此您可以使用process.env
访问环境变量,例如kxe2p93d5#
mongo change request给出了一个建议:
然后在
~/mongorc.js
中:pdsfdshx6#
如果是Mongo 6,则使用
process.env
:在6.x之前:
顺便说一下,
mongo
映像(docker
)附带了jq
,尽管这可能会改变。