How do I access Meteor's MongoDB from another

2019-01-21 00:47发布

问题:

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?

回答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.



回答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.



回答3:

Use the Meteor deployment instructions

The command will look like this:

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


回答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.



回答5:

And here a shell script to get Mongo URI and Mongo Database:

#!/bin/bash -eux

read -s -p "Enter Password: " password

cmd=$(meteor mongo --url myapp.meteor.com << ENDPASS
$password
ENDPASS)
mongo_uri=$(echo $cmd | cut -f2 -d" ")
mongo_db=$(echo $mongo_uri | cut -d/ -f 4)

#my_client_command_with MONGODB_URI=$mongo_uri MONGO_DB=$mongo_db

````



回答6:

In regards to a 10 second delay on updates: Tail the MongoDB oplog! There's more information on how to do it here:

http://meteorhacks.com/lets-scale-meteor.html

Make sure you install smart collections and use those (instantiate your collections using Meteor.SmartCollection instead of Meteor.Collection) and you will find the updates are essentially immediate.