Storing and retrieving from MongoDB
MongoDB has become one of the most popular, so-called, NoSQL databases that are there. It is highly scalable, has a very flexible data model and highly expressive query language. MongoDB is highly popular for storing unstructured data, especially for web-based apps: MEAN.js combines MongoDB, Express.js, Angular.js, and Node.js in one fullstack framework.
Getting ready
You need to have pandas
and PyMongo
modules installed. If you do not have PyMongo
, you can either use conda
to install the missing package or go to http://api.mongodb.org/python/current/installation.html#installing-from-source and follow the steps listed there.
Also, you need the MongoDB database up and running on your computer. You can download MongoDB from https://www.mongodb.org/downloads and then follow the instructions listed at http://docs.mongodb.org/manual/installation/ for your operating system.
No other prerequisites are required.
How to do it…
Accessing and storing documents in MongoDB is almost effortless. We assume that the data to store in the database are accessible to us in a pandas'
DataFrame object csv_read
(the store_mongodb.py
file):
# connect to the MongoDB database client = pymongo.MongoClient() # and select packt database db = client['packt'] # then connect to real_estate collection real_estate = db['real_estate'] # and then insert the data real_estate.insert(csv_read.to_dict(orient='records'))
How it works…
We first create a connection to MongoDB. As we are not passing any arguments to the MongoClient(...)
method, PyMongo
will connect to the default MongoDB database running on localhost
and listening on port 27017
. If you would like to connect to a different database, you can override these defaults; assuming that the database you want to connect to runs on a server with IP 10.92.1.12
and listens on a port 1234
, you can use the following code:
client = pymongo.MongoClient(host='10.92.1.12', port=1234)
Tip
A full list of the MongoClient(...)
method's available parameters with explanations is available at http://api.mongodb.org/python/current/api/pymongo/mongo_client.html.
The MongoClient(...)
method automatically connects to the MongoDB database so there is no need to do it manually. Once connected, we connect to the internal database object we are after (in our case, we called it packt
) and we store it in the db
object. Depending on whether the real_estate
collection exists or not in the database, the next line of our script either opens the collection or creates a new one, respectively. We then get access to this collection through the real_estate
object.
Note
In MongoDB, collections are equivalents of tables. Each collection consists of documents, equivalents to records from the relational database world.
Then, and only then, we can start storing our documents in the collection. We use the insert(...)
method to load the data to the collection.
Note
We use version 2.8 of PyMongo. In the newest (at the time of writing this book) stable version 3.0, the insert(...)
method was deprecated in favor of insert_many(...)
. Refer to the documentation of your version of PyMongo at http://api.mongodb.org/python/2.8/api/index.html or http://api.mongodb.org/python/3.0/api/index.html.
The insert(...)
method accepts a list of dictionaries. We use DataFrame's to_dict(...)
method that does all the heavy lifting for us in transforming the data into a list of dictionaries. The orient='records'
option instructs the method to return a list where each element is a dictionary with column names as keys and corresponding values. Each element of the resulting list will form a document in the collection.
The insert(...)
method appends the data by default. If this is not desired, you can use the following code to remove all the documents from the collection before inserting into it:
# if there are any documents stored already -- remove them if real_estate.count() > 0: real_estate.remove()
The count()
method calculates the total number of documents in the collection—if there are any, the remove()
method deletes all the documents.
Next, we want to print top 10 sales (by record ID) from ZIP codes 95841
and 95842
. We can do it easily by querying our collection:
sales = real_estate.find({'zip': {'$in': [95841, 95842]}}) for sale in sales.sort('_id').limit(10): print(sale)
First, we extract all the sales from these ZIP codes. In our data, the field name we are after is zip
. The $in
operator works in the same way as the ANSI SQL expression IN (...)
so we can specify a list of all the ZIP codes that we want to retrieve from the database. The find(...)
method returns a cursor
object; the cursor object is a generator. So, we use it to iterate through all the sales and print out each individual sale to the screen.
See also
I suggest referring to the documentation of MongoDB at http://docs.mongodb.org/v2.6/ and
PyMongo
for more details.