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);
我正在 运行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);