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

Shu*_*shi 11 shell mongodb

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

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

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

Kar*_*n B 13

这对我有用:

mongo --eval "var my_var = '$MY_VAR'" my_script.js
Run Code Online (Sandbox Code Playgroud)

遗漏了<. mongo将处理命令行上的任何剩余参数作为要执行/解释的文件,但显然组合shell输入重定向--eval会导致javascript命名空间被重置.

我假设但无法确认这是因为作为参数传递的文件名是通过load()机制处理的,根据https://docs.mongodb.com/v3.2/reference/method/load/,其行为如下:

在使用load()执行文件后,您可以引用从mongo shell环境定义文件的任何函数或变量.


Wer*_*eit 6

貌似shellGetEnv()同时添加了Native Method,参见MongoDB GitHub

功能可用(感谢@orgads):

_getEnv("PATH")
Run Code Online (Sandbox Code Playgroud)

但是,它没有记录在案,也没有声明它是否可以由最终用户使用或仅作为内部命令。

新的 MongoDB Shellmongosh是一个功能齐全的 JavaScript 和Node.js 14.x REPL 环境,因此您可以使用 访问环境变量process.env,例如

process.env["PATH"]
Run Code Online (Sandbox Code Playgroud)

  • 函数名称是“_getEnv”。`shellGetEnv` 是本机实现。 (2认同)

小智 5

由于 Mongo4.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`)
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

db.createCollection("myCol",
 { capped: true,
   size: getEnvValue('MYCOL_MAX_SIZE_GB', 2)*1024*1024*1024
});
Run Code Online (Sandbox Code Playgroud)

这依赖于主机外壳,但在我的情况下是可以接受的(Docker)。

还试图environ直接阅读:

cat('/proc/self/environ').split('\0') # Doesn't work
Run Code Online (Sandbox Code Playgroud)

但它只获取第一个变量。我猜是因为空字符......

  • 我已经使用了你的方法,但我必须为 printenv 添加 --null 参数以避免换行。`printenv --null ${envVar} &gt;/tmp/${envVar}.txt` (2认同)

Ale*_*his 5

根据这个 commit,看起来有一个本机方法_getEnv()可以为你做这件事。

const username = _getEnv('DB_USERNAME')
const password = _getEnv('DB_PASSWORD')
// use the username and password
Run Code Online (Sandbox Code Playgroud)

  • @ReFruity, `mongosh` 也是一个 Node.js shell,所以只需使用 [process.env](https://nodejs.org/api/process.html#processenv): `process.env["DB_USERNAME"]` (2认同)