我一直在使用这样的 mongo 和脚本文件:
$ mongo getSimilar.js
我想将参数传递给文件:
$ mongo getSimilar.js apples
然后在脚本文件中选择传入的参数。
var arg = $1;
print(arg);
我一直在使用这样的 mongo 和脚本文件:
$ mongo getSimilar.js
我想将参数传递给文件:
$ mongo getSimilar.js apples
然后在脚本文件中选择传入的参数。
var arg = $1;
print(arg);
使用--eval
并使用shell脚本来修改传入的命令。
mongo --eval "print('apples');"
或者制作全局变量(感谢 Tad Marshall):
$ cat addthem.js
printjson( param1 + param2 );
$ ./mongo --nodb --quiet --eval "var param1=7, param2=8" addthem.js
15
你不能这样做,但你可以将它们放在另一个脚本中并首先加载:
// vars.js
msg = "apples";
getSimilar.js 是:
print(msg);
然后:
$ mongo vars.js getSimilar.js
MongoDB shell version: blah
connecting to: test
loading file: vars.js
loading file: getSimilar.js
apples
不过,不太方便。
设置一个外壳变量:
password='bladiebla'
创建js脚本:
cat <<EOT > mongo-create-user.js
print('drop user admin');
db.dropUser('admin');
db.createUser({
user: 'admin',
pwd: '${password}',
roles: [ 'readWrite']
});
EOT
将脚本传递给 mongo:
mongo mongo-create-user.js
我使用 shell 脚本将 mongo 命令通过管道传输到 mongo。在 mongo 命令中,我使用了一个传递给 shell 脚本的 arg(即我使用了$1
):
#!/bin/sh
objId=$1
EVAL="db.account.find({\"_id\" : \"$objId\"})"
echo $EVAL | mongo localhost:27718/balance_mgmt --quiet
我通过使用 javascript bundler parcel 解决了这个问题:https ://parceljs.org/
有了这个,可以在脚本中使用节点环境变量,例如:
var collection = process.env.COLLECTION;
使用包裹构建时,env var 被内联:
parcel build ./src/index.js --no-source-maps
唯一的缺点是,每次要更改环境变量时都必须重新构建脚本。但由于包裹真的很快,这不是一个真正的问题恕我直言。
我写了一个小工具来为自己解决这个问题。使用该mongoexec
实用程序,您可以./getSimilar.js apples
通过将以下内容添加到脚本的开头来运行该命令:
#!/usr/bin/mongoexec --quiet
在脚本中,您可以将参数作为args[0]
.
2022年更新:
使用时,mongosh
您可以从process.argv
mongosh script.js param1 param2
// process.argv will be [.... , 'param1', param2']
棘手的一点是mongosh
它将尝试将参数(例如param1
和param2
)作为附加脚本执行,但这可以通过使用结束脚本来防止quit()
。(TBH,我不确定这是设计/预期/记录的)