首页 > 解决方案 > 如何在 MongoDB shell 中从与脚本相同的目录加载文件

问题描述

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

外部脚本.sh

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

jsscript.js

load(myVars.js);

MongoDB是v4.0.19

该脚本可以在本地或远程服务器上运行,它可以从命令行或 cron 作业运行,我想加载 myVars.js,它始终与 outerscript.sh 位于同一文件夹中。

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

pwd() 返回用户的主目录,而不是当前运行脚本的位置,因此这不适用于 cron 作业:

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

这也不适用于 cron 工作,我猜出于同样的原因:

load('./myVars.js');

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

谢谢!

标签: mongodbcronmongo-shell

解决方案


您不需要重定向,请尝试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 "$0")"


推荐阅读