Ruan Bekker's Blog

From a Curious mind to Posts on Github

Using the Python API for MongoDB Using PyMongo

Using the Python API for MongoDB using Pymongo

Requirements:

You will need to install the pymongo driver using pip:

Install Pymongo
1
$ pip install pymongo

A configuration file with your access credentials, which I like to use outside my code:

config.py
1
2
3
4
5
6
7
credentials = {
    "mongodb": {
        "HOSTNAME": "host.domain.com",
        "USERNAME": "username",
        "PASSWORD": "password"
    }
}

Connecting to MongoDB:

From the python interpreter, connect to MongoDB:

1
2
3
4
5
6
>>> from pymongo import MongoClient
>>> from config import credentials as secrets
>>> mongo_host = secrets['mongodb']['HOSTNAME']
>>> mongo_username = secrets['mongodb']['USERNAME']
>>> mongo_password = secrets['mongodb']['PASSWORD']
>>> mongodb_client = MongoClient('mongodb://%s:%s@%s:27017/admin?authMechanism=SCRAM-SHA-1' % (mongo_username, mongo_password, mongo_host))

Find the Database that you are connected to:

1
2
>>> mongodb_client.get_database().name
u'admin'

Find all the databases that is currently on your MongoDB Server:

1
2
3
4
5
6
7
>>> dbs = mongodb_client.database_names()
>>> for x in dbs:
...     print(x)
...
admin
flask_reminders
local

Create a Database, Collection and Write a Document into your Database:

Let’s create a database, in my case it will be ruan-test, and my collection name mycollection and the write one item into it:

1
2
3
4
5
6
>>> newdb = mongodb_client['ruan-test']
>>> newdb_collection = newdb['mycollection']
>>> doc = {"name": "frank", "surname": "jeffreys", "tags": ["person", "name"]}
>>> doc_id = newdb_collection.insert_one(doc).inserted_id
>>> print(doc_id)
59a319ec1f15a5088ba3a339

Note: you can also connect to your collection like the following

1
>>> newdb_collection = mongodb_client['ruan-test']['mycollection']

We have inserted one item into our database, which we can verify with count():

1
2
>>> newdb_collection.find().count()
1

As you can see I have the value of the item’s id, we can use that to find it from our collection:

1
2
>>> newdb_collection.find_one({"_id": doc_id})
{u'_id': ObjectId('59a319ec1f15a5088ba3a339'), u'surname': u'jeffreys', u'name': u'frank', u'tags': [u'person', u'name']}

As we only have one item in our database, we can also use find_one() which will give us the exact same data:

1
2
>>> newdb_collection.find_one()
{u'_id': ObjectId('59a319ec1f15a5088ba3a339'), u'surname': u'jeffreys', u'name': u'frank', u'tags': [u'person', u'name']}

We can write some more data to our database, but this time, lets write to a different collection:

1
2
3
>>> newdb_collection2 = newdb['new-collection-2']
>>> item = newdb_collection2.insert_one({"name": "ruby", "surname": "james"}).inserted_id
>>> item2 = newdb_collection2.insert_one({"name": "ruby", "surname": "james"}).inserted_id

As we captured the items _id, we can view the:

1
2
3
4
>>> print(item)
59a31acf1f15a5088ba3a33b
>>> print(item2)
59a31a8a1f15a5088ba3a33a

Query Data from MongoDB:

We can then query for this data:

1
2
3
4
5
>>> newdb2.find_one({"name": "ruby"})
{u'_id': ObjectId('59a31acf1f15a5088ba3a33b'), u'surname': u'james', u'name': u'ruby'}

>>> newdb2.find_one({"_id": item})
{u'_id': ObjectId('59a31acf1f15a5088ba3a33b'), u'surname': u'james', u'name': u'ruby'}

Also scan for all items in the collection:

1
2
3
4
5
6
7
8
9
>>> scan = newdb_collection2.find({})
>>> for x in scan:
...     print(x)
...
{u'_id': ObjectId('59a31a8a1f15a5088ba3a33a'), u'surname': u'james', u'name': u'phillip'}
{u'_id': ObjectId('59a31acf1f15a5088ba3a33b'), u'surname': u'james', u'name': u'ruby'}

>>> newdb2.find().count()
2

We can now verify that we have 2 collections in our database:

1
2
>>> newdb.collection_names()
[u'mycollection-2', u'mycollection']

Connecting to an existing Database:

Let’s connect to an existing database on our MongoDB Server:

1
>>> flaskdb = mongodb_client['flask_reminders']

List the collections:

1
2
>>> flaskdb.collection_names()
[u'reminders', u'usersessions']

Count the number of items in our reminders Collection:

1
2
>>> flaskdb.reminders.find().count()
624

Find a Random Item:

1
2
>>> flaskdb.reminders.find_one()
{u'category': u'Python', u'description': u'Chatbot with SQLite', u'link': u'http://rodic.fr/blog/python-chatbot-1/', u'date': u'2017-01-03', u'_id': ObjectId('586bb6dd0269103671afce32'), u'type': u'Discovered Service'}

Find One Item, with a Specific Value, for example the value AWS for our Category key:

1
2
>>> flaskdb.reminders.find_one({"category": "AWS"})
{u'category': u'AWS', u'description': u'Elasticsearch Documentation Access Policies', u'link': u'http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-createupdatedomains.html#es-createdomain-configure-access-policies', u'date': u'2017-02-13', u'_id': ObjectId('58a1d45202691070616947c3'), u'type': u'Documentation'}

Find All Items, with a specific value:

1
2
3
4
5
6
>>> data = flaskdb.reminders.find({"category": "AWS"})
>>> for x in data:
...     print(x)
...
{u'category': u'Python', u'description': u'Chatbot with SQLite', u'link': u'http://rodic.fr/blog/python-chatbot-1/', u'date': u'2017-01-03', u'_id': ObjectId('586bb6dd0269103671afce32'), u'type': u'Discovered Service'}
{u'category': u'Python', u'description': u'Boto: Kinesis List', u'link': u'https://gitlab.com/rbekker87/code-examples/blob/master/kinesis/firehose/python/firehose.list.py', u'date': u'2017-01-05', u'_id': ObjectId('586dde1e0269103671afce36'), u'type': u'Stuff Done'}

Deleting Databases:

Cleaning up, deleting the database that we created, when a database is delete, the collections within that database also gets removed.

First list the databases:

1
2
3
4
5
6
7
8
>>> dbs = mongodb_client.database_names()
>>> for x in dbs:
...     print(x)
...
admin
flask_reminders
local
ruan-test

Then delete the database that you want to delete:

1
>>> mongodb_client.drop_database("ruan-test")

Then verify if the database was removed:

1
2
3
4
5
6
7
>>> dbs = mongodb_client.database_names()
>>> for x in dbs:
...     print(x)
...
admin
flask_reminders
local

Resources: