How to pass argument to Mongo Script

JavascriptMongodbScripting

Javascript Problem Overview


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

Javascript Solutions


Solution 1 - Javascript

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

Solution 2 - Javascript

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 3 - Javascript

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 4 - Javascript

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 5 - Javascript

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 6 - Javascript

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

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)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBrigView Question on Stackoverflow
Solution 1 - JavascriptjcollumView Answer on Stackoverflow
Solution 2 - JavascriptkristinaView Answer on Stackoverflow
Solution 3 - JavascriptrobodoView Answer on Stackoverflow
Solution 4 - JavascriptTonyView Answer on Stackoverflow
Solution 5 - Javascriptuser764486View Answer on Stackoverflow
Solution 6 - Javascriptbeac0nView Answer on Stackoverflow
Solution 7 - JavascriptNirView Answer on Stackoverflow