<strong opinions>
Whoah! That was my 1st and 2nd, and 3rd.. and goes on… and on.. impression of this amazing database. Having experience with SQL Server and MySQL (both relational databases) for a few good years I decided to take this NoSQL database for a real world run. I also think the massive signs for MongoDB conference in San Francisco on the 101 had subliminally stamped a mark on my neurons 😉 I also read some interesting articles here and here comparing MongoDB to other NoSQL solutions.. After all that I was convinced that MongoDB would be the NoSQL database I would invest some serious time into.
As expressed above, I was impressed by MongoDB. I hooked it into a Zend MVC (Model–view–controller) application accessing Shanty-Mongo ORM through custom Model classes which I wrote from ground up. Everything just fit in so snugly.. and when I threw data against MongoDB it created collections (SQL world you’d call this tables) on the fly. Yes on the fly! That was super cool – loosely coupled interfacing – > create a Class Model and let the DB handle the rest. Super cool. Plus, this baby just flies! Everything from how fast it retrieves, stores, updates (even partial updates) and searches your data to how it stores it as Binary JSON both on the file structure and in memory (during open connection) on the server to speed things up. Everything about this database is impressive.
</strong opinions>
Ok enough of my ramblings. I think you get the picture. I am impressed.
If you are impressed and want to give MongoDB a try, read on. Next let’s dig in and explore stuff that is important (and what I learnt) about MongoDB, how to set it up and common commands to keep handy when working in the terminal.
Hello MongoDB
“MongoDB (from “humongous”) is a scalable, high-performance, open source, document-oriented database. MongoDB bridges the gap between key-value stores (which are fast and highly scalable) and traditional RDBMS systems (which provide rich queries and deep functionality).” ~ from MongoDB
Then (RDBMS) and now
- Tables as you know in SQL are called “collections” in MongoDB.
- Relational DB has records (record sets), MongoDB calls them “documents”.
- MongoDB stores all data in JSON objects and serialized to BSON (Binary JSON) for storage. CouchDB (you may also know of) stores in just JSON.
- In MongoDB, “ObjectId” in a collection is similar to auto-incrementing ID in a Relational database table.
- Here’s a nice mapping chart between SQL and Mongo: http://www.mongodb.org/display/DOCS/SQL+to+Mongo+Mapping+Chart
More FYI notes:
- You never create a database or collection. MongoDB does not require that you do so. As soon as you insert something, MongoDB creates the underlying collection and database.
- If you query a collection that does not exist, MongoDB treats it as an empty collection.
- Switching to a database with the use command won’t immediately create the database – the database is created lazily the first time data is inserted. This means that if you use a database for the first time it won’t show up in the list provided by `show dbs` until data is inserted.
- Mongo uses memory mapped files to access data, which results in large numbers being displayed in tools like top for the mongod process. Think performance! You can get a feel for the “inherent” memory footprint of Mongo by starting it fresh, with no connections, with an empty /data/db directory and looking at the resident bytes.
Installing MongoDB on a Debian OS (Ubuntu)
If you’re using Ubuntu Server (I used 10.10), you can also install MongoDB using aptitude. Default Ubuntu sources do not contain MongoDB so you need to add distro location to your /etc/apt/sources.list file. That is easily done. 1st open sources.list in terminal editor (nano) like this:
sudo nano /etc/apt/sources.list
and drop & save this line to the end of the file:
deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen
Exit nano and add the following 10gen GPG key, or apt will disable the repository (apt uses encryption keys to verify the repository is trusted and disables untrusted ones).
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10
Now your ready to install the package with aptitude by executing the following commands:
shell> sudo apt-get update shell> sudo apt-get install mongodb-10gen
Finally, fork mongo as a Daemon (to auto run on boot).
shell> sudo mongod --fork --logpath /var/log/mongodb.log --logappend
You can now use the command-line client to access the MongoDB database server, as below:
shell> mongo
You may want to hook up MongoDB to be accessible from your PHP application by editing your php.ini and allowing mongo to run as an extension. 1st find & edit your php.ini location like this:
sudo find / -name php.ini sudo nano /php.ini
Then add & save mongo as an extension inside php.ini under “Dynamic Extensions”:
extension=mongo.so
Save & restart Apache:
sudo /etc/init.d/apache2 restart
Common MongoDB commands
Here’s a short list of the most common commands you will end up using when interfacing with the database. If you want to use a GUI to access MongoDB, I found MongoHub the best GUI administration tool for Mac. There is also a very comprehensive MongoDB documentation located here.
Purpose | Shell Command |
Login to interface | mongo |
Show all dbs on record | show dbs |
Switch to my database | use mydb |
Show all collections on record | show collections |
List db version | db.version() |
Insert data into a new collection | db.items.insert({ name:’eggs’, quantity: 10, price: 1.50 }) |
Display a whole list of documents in a collection | db.items.find({}) |
Display a select list of documents in a collection | db.items.find({guid:xyz}) |
Remove a whole list of documents in a collection | db.guid.remove({}) or where n == 1 db.things.remove({n:1}); |
Drop the collection | db.<>.drop() |
Cons: when you delete a document you cannot return it’s ObjectId. Would be nice to have this feature. MongoDB folks?
MongoDB start ritual (habit forming):
- mongo
- show dbs
- use mydbname
- show collections
This will become a habit so don’t resist.
Plenty of new knowledge on tools, crash recovery & best practices.
Give MongoDB a spin
If you are in doubt, give MongoDB a spin and make up your own mind ~ http://www.mongodb.org/
Don’t forget to let me know how your experience goes.. and if you have questions on getting this setup please contact me and I will be more than happy to help you out!
~ Ernest
Recommended links
- Ubuntu and Debian packages: http://www.mongodb.org/display/DOCS/Ubuntu+and+Debian+packages
- Starting and Stopping Mongo: http://www.mongodb.org/display/DOCS/Starting+and+Stopping+Mongo
- Getting Started with MongoDB and PHP: http://devzone.zend.com/article/12132
- MongoDB: http://www.mongodb.org/display/DOCS/Home
- MongoDB PHP language center: http://www.mongodb.org/display/DOCS/PHP+Language+Center
How does something like a migration work (from a relational perspective)? E.g. I want to say, change an attribute name of a collection? How does that kind of stuff work?
Good question. Thank you for asking.
The schema-less nature of the document store prevents that. That’s NoSQL in general though. There are wins and loses so its best if you choose the right data store which meets your needs. In MongoDB each document is stored with its attributes intact; BSON is a binary serialized form of JSON. So the attribute names are embedded in each document that use them.
The only solution is to read & update (with new attributes) the documents back to your collection. This can be done lazily via your ORM. Modify the ORM Model with your new attribute name and leave it to MongoDB to handle the rest. To finish it off you can also write a script that finishes the rest.