如何将参数传递给Mongo Script


68

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

$ mongo getSimilar.js

我想将参数传递给文件:

$ mongo getSimilar.js apples

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

var arg  = $1;
print(arg);

Answers:


112

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

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

或创建全局变量(贷给塔德·马歇尔):

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

1
这不适用于mapreduce,reduce()函数无法访问参数(ReferenceError:...在...附近未定义)
Thomas

4
--eval非常有用。说我们要快速更改为在复制集中成为主要对象。使用脚本conf = rs.conf() conf.members.forEach( function (member) { member.priority = 0.5 } ) conf.members[memberId].priority = 1 // rs.reconfig(conf)将此脚本保存在choiceprimary.js中,并使用运行mongo --eval "var memberId=3" chooseprimary.js。memberId应该是您希望成为主节点的辅助节点的ID。只要确保在主服务器上执行mongo --eval即可。:)
开发人员MariusŽilėnas2016年

24

您不能这样做,但是可以将它们放在另一个脚本中并先加载该脚本:

// 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

但是,不太方便。


太好了,谢谢你的信息!我有一些脚本很难做到--eval
蒂姆·富尔默

2

设置一个外壳变量:

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

1
这不适用于2.4。您能否指向文档或对此进行扩展?
conner.xyz 2015年

1

我使用了一个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

那不是find({\"_id\" : ObjectId(\"$objId\")})吗?还是有办法设置mongo,以便您不必使用该ObjectId()家伙?
AqC

0

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

#!/usr/bin/mongoexec --quiet

然后,您可以在脚本中以以下方式访问参数: args[0]

https://github.com/pveierland/mongoexec


不起作用;我的访问被拒绝。 sudo不能解决问题。将shebang更改为指向用户目录(而不是/ usr / bin)中的可执行文件不起作用。所有人都为使用它感到兴奋。希望我能使它工作。
AqC

1
@熊该说明未能提及该脚本必须是可执行的。如果运行“ sudo chmod + rx / usr / bin / mongoexec”,它应该可以工作。
user764486

0

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

这样,就可以在脚本中使用节点环境变量,例如:

var collection = process.env.COLLECTION;

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

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

唯一的缺点是,每次要更改环境变量时,都必须重新构建脚本。但是由于包裹的速度非常快,所以恕我直言,这并不是问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.