如何将参数传递给 Mongo 脚本

How to pass argument to Mongo Script

本文关键字:Mongo 脚本 参数传递      更新时间:2023-09-26

我一直在使用mongo和脚本文件,如下所示:

$ mongo getSimilar.js

我想将参数传递给文件:

$ mongo getSimilar.js apples

然后在脚本文件中选取传入的参数。

var arg  = $1;
print(arg);

使用 --eval 并使用 shell 脚本来修改传入的命令。

mongo --eval "print('apples');"

或者制作全局变量(归功于泰德·马歇尔):

$ cat addthem.js
printjson( param1 + param2 );
$ ./mongo --nodb --quiet --eval "var param1=7, param2=8" addthem.js
15

你不能这样做,但你可以把它们放在另一个脚本中并首先加载它:

// vars.js
msg = "apples";

和得到相似.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

> 2022 年更新:

使用mongosh时,您可以从process.argv读取执行参数

mongosh script.js param1 param2 
// process.argv will be [.... , 'param1', param2']

棘手的一点是mongosh将尝试执行参数(例如 param1param2 ) 作为附加脚本,但这可以通过使用 quit() 结束脚本来防止。(TBH,我不确定这是设计使然/有意/有记录)

我使用 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

我写了一个小工具来为自己解决问题。使用 mongoexec 实用程序,您可以通过在脚本开头添加以下内容来运行命令./getSimilar.js apples

#!/usr/bin/mongoexec --quiet

在脚本中,您可以访问参数作为args[0]

https://github.com/pveierland/mongoexec

我通过使用javascript捆绑器包解决了这个问题:https://parceljs.org/

有了这个,可以在脚本中使用节点环境变量,例如:

var collection = process.env.COLLECTION;

使用宗地构建时,环境 var 会内联:

parcel build ./src/index.js --no-source-maps

唯一的缺点是,每次要更改 env var 时都必须重建脚本。但是由于包裹真的很快,恕我直言,这不是一个真正的问题。