I've been using mongo and script files like this:
$ mongo getSimilar.js I would like to pass an argument to the file:
$ mongo getSimilar.js apples And then in the script file pick up the argument passed in.
var arg = $1; print(arg); Use --eval and use shell scripting to modify the command passed in.
mongo --eval "print('apples');"
Or make global variables (credit to Tad Marshall):
$ cat addthem.js printjson( param1 + param2 ); $ ./mongo --nodb --quiet --eval "var param1=7, param2=8" addthem.js 15 conf = rs.conf() conf.members.forEach( function (member) { member.priority = 0.5 } ) conf.members[memberId].priority = 1 // rs.reconfig(conf) save this script in chooseprimary.js and run with mongo --eval "var memberId=3" chooseprimary.js . memberId should be the id of the secondary you wish to become primary. Just make sure to execute mongo --eval on the Primary server. :)You can't do that, but you could put them in another script and load that first:
// vars.js msg = "apples"; and getSimilar.js was:
print(msg); Then:
$ mongo vars.js getSimilar.js MongoDB shell version: blah connecting to: test loading file: vars.js loading file: getSimilar.js apples Not quite as convenient, though.
--eval.Set a shell var:
password='bladiebla' Create js script:
cat <<EOT > mongo-create-user.js print('drop user admin'); db.dropUser('admin'); db.createUser({ user: 'admin', pwd: '${password}', roles: [ 'readWrite'] }); EOT Pass script to mongo:
mongo mongo-create-user.js 2022 update:
when using mongosh you can read the execution arguments from process.argv
mongosh script.js param1 param2 // process.argv will be [.... , 'param1', param2'] the tricky bit is that mongosh will try to execute the parameters (e.g. param1 and param2) as additional scripts, but this can be prevented by ending the script using quit(). (TBH, I'm not sure it's by design / intended / documented)
param1=yourParamValue mongosh $mongoUrl script.js --quiet and access the param in javascript with process.env.param1. That works perfectly in Mac and unix. On Windows it's slightly different.I used a shell script to pipe a mongo command to mongo. In the mongo command I used an arg I passed to the shell script (i.e. i used $1):
#!/bin/sh objId=$1 EVAL="db.account.find({\"_id\" : \"$objId\"})" echo $EVAL | mongo localhost:27718/balance_mgmt --quiet I wrote a small utility to solve the problem for myself. With the mongoexec utility, you would be able to run the command ./getSimilar.js apples by adding the following to the beginning of your script:
#!/usr/bin/mongoexec --quiet Within the script, you can then access the arguments as args[0].
I solved this problem, by using the javascript bundler parcel: https://parceljs.org/
With this, one can use node environment variables in a script like:
var collection = process.env.COLLECTION; when building with parcel, the env var gets inlined:
parcel build ./src/index.js --no-source-maps The only downside is, that you have to rebuild the script every time you want to change the env vars. But since parcel is really fast, this is not really a problem imho.