MongoDB shell 如何从与脚本相同的目录加载文件

How to load a file from the same directory as the script, in MongoDB shell

我正在 运行ning 一个 bash 脚本执行 Mongo 中的 javascript 文件 shell:

outerscript.sh

SCRIPTPATH="$( cd "$(dirname "[=12=]")" ; pwd -P )"
LOGDIR=~/logs
LOGFILE=$LOGDIR/outerscript.log
mongo < $SCRIPTPATH/jsscript.js >> $LOGFILE 2>&1

jsscript.js

load(myVars.js);

Mongo数据库是 v4.0.19

脚本可能是 运行 本地或远程服务器,也可能是 运行 来自命令行或来自 cron 作业,我想加载 myVars.js 始终与 outerscript.sh.

在同一文件夹中

当从 cron 作业 运行ning outerscript.sh 时,我找不到加载 myVars.js 的方法。

pwd() returns 用户的主目录,而不是当前 运行ning 脚本的位置,因此这对 cron 作业不起作用:

load(pwd() + '/myVars.js');

这对 cron 作业也不起作用,我猜出于同样的原因:

load('./myVars.js');

或者,是否有另一种方法可以将变量传递到我的 JavaScript 文件中,这样我仍然可以将输出记录到日志文件中?据我所知,你不能将 --eval 与日志输出结合到文件中,而且我还没有找到直接从 JS 文件内部读取环境变量的方法。

谢谢!

您不需要重定向,请尝试 mongo $SCRIPTPATH/jsscript.js >> $LOGFILE 2>&1

$ mongo --help
MongoDB shell version v4.4.1
usage: mongo [options] [db address] [file names (ending in .js)]
db address can be:
  foo                   foo database on local machine
  192.168.0.5/foo       foo database on 192.168.0.5 machine
  192.168.0.5:9999/foo  foo database on 192.168.0.5 machine on port 9999
  mongodb://192.168.0.5:9999/foo  connection string URI can also be used

您可以在您的 js 脚本中使用 cat()

例如

echo '{"path": "some folder"}' > /tmp/foldername.js

然后在你的js脚本中:

var txt = cat("/tmp/foldername.js")
var folderObj = JSON.parse(txt)

然后您可以在脚本中使用 folderObj 对象。

为什么不直接使用SCRIPTPATH="$(dirname "[=15=]")"

Wernfried Domscheit 完美地回答了我的问题,我接受了这个答案。

我还研究了如何将环境变量作为参数传递,并将其张贴在这里以防它对任何人有帮助。

outerscript.sh

SCRIPTPATH="$( cd "$(dirname "[=10=]")" ; pwd -P )"

ENVVARS='var mongoAddress='\'"${MONGO_ADDRESS}"\''; var databaseName='\'"${DATABASE_NAME}"\'

mongo --eval "${ENVVARS}" $SCRIPTPATH/jsscript.js >> $LOGFILE 2>&1

jsscript.js

print(mongoAddress);
print(databaseName);