How do I access Meteor's MongoDB from another client, while Meteor is running?

I would like to access Meteor's MongoDB from a Python client, while Meteor is running.

I can't start a mongod because Meteor's database is locked.

How do I access the database from another client?


Solution 1:

The meteor command provides a clean way. To get the URL for the running mongod:

meteor mongo -U

which you can parse from python.

Solution 2:

Meteor starts the mongod for you on port 3002 when you run the meteor command, and stores the mongo data file in .meteor/local/db

Output from ps aux | grep 'mongod' shows the mongod command that meteor uses:

/usr/local/meteor/mongodb/bin/mongod --bind_ip 127.0.0.1 --smallfiles --port 3002 --dbpath /path/to/your/project/.meteor/local/db

So just connect your mongo client accordingly. In python:

>>> import pymongo
>>> con = pymongo.Connection(host='127.0.0.1', port=3002)
>>> con.database_names()
[u'meteor', u'local']

UPDATE: unfortunately making changes directly in mongo in this way won't reflect live in the app, but the changes will be reflected on a full page (re)load.

Solution 3:

Use the Meteor deployment instructions

The command will look like this:

   PORT=3000 MONGO_URL=mongodb://localhost:27017/myapp node bundle/main.js

Solution 4:

You can also find it from within server side code using:

process.env.MONGO_URL

Even if you don't set this environment variable when running, it gets set to the default. This seems to be how it is found internally (packages/mongo/remote_collection_driver.js)

The one is given by meteor mongo -U seems to reconstruct the default domain/ip and db-name, but use the port stored in the file.

You can put this anywhere in the server folder, and read it from the command line.

console.log('db url: ' + process.env.MONGO_URL);

I set up a webpage to display it to double check in the selenium tests that we are using the test database, and not overwriting live data.