【问题标题】:How to pass environment variable to mongo script如何将环境变量传递给mongo脚本
【发布时间】:2016-09-12 06:29:08
【问题描述】:

我想将名为file_path的环境变量传递给js文件。

我正在使用以下语法:

mongo --eval "var file_path='$file_path'" < aggregation.js

输出:

MongoDB shell version: 3.2.9-rc0
connecting to: test

注意:

它不执行aggregation.js 文件。 只有它通过参数。

【问题讨论】:

标签: mongodb shell


【解决方案1】:

这对我有用:

mongo --eval "var my_var = '$MY_VAR'" my_script.js

省略&lt;mongo 会将命令行上的所有剩余参数作为要执行/解释的文件处理,但显然将 shell 输入重定向与 --eval 结合会导致 javascript 命名空间被重置。

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

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

【讨论】:

    【解决方案2】:

    根据this commit,看起来有一个名为_getEnv() 的本机方法可以为您完成。

    const username = _getEnv('DB_USERNAME')
    const password = _getEnv('DB_PASSWORD')
    // use the username and password
    

    【讨论】:

    【解决方案3】:

    由于 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
    

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

    【讨论】:

    • 我已经使用了您的方法,但我必须将 --null 参数设置为 printenv 以避免换行。 printenv --null ${envVar} &gt;/tmp/${envVar}.txt
    • run()好像是无证的,见Native Methods你觉得用它省钱吗?
    【解决方案4】:

    mongochange request有一个建议:

    alias mongo="export | sed 's/declare -x /env./' > shell.js; mongo $@; rm shell.js;"
    

    然后在~/mongorc.js:

    var env = {};
    load('shell.js');
    

    【讨论】:

      【解决方案5】:

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

      功能可用(感谢@orgads):

      _getEnv("PATH")
      

      但是,它没有记录在案,并且有 no statement yet 是否可以由最终用户使用或仅用作内部命令。

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

      process.env["PATH"]
      

      【讨论】:

      • 函数名是_getEnvshellGetEnv 是本机实现。
      猜你喜欢
      • 1970-01-01
      • 2021-02-12
      • 1970-01-01
      • 2015-06-08
      • 2022-11-03
      • 1970-01-01
      • 1970-01-01
      • 2021-06-25
      • 2013-12-29
      相关资源
      最近更新 更多