'How to pass argument to Mongo Script

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);


Solution 1:[1]

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.

Solution 2:[2]

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

Solution 3:[3]

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

Solution 4:[4]

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].

https://github.com/pveierland/mongoexec

Solution 5:[5]

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.

Solution 6:[6]

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)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 kristina
Solution 2 robodo
Solution 3 skypjack
Solution 4 user764486
Solution 5 beac0n
Solution 6 Nir