Flexing NoSQL: MongoDB in review

MongoDB shines with broad programming language support, SQL-like queries, and out-of-the-box scaling

Page 3 of 4

MongoDB: RDBMS style queries

Although many document stores (and NoSQL implementations in general) eschew the notion of SQL and thus implement custom query languages and data access schemes, Mongo's query language is SQL-like. In fact, at a high level, it operates a lot like SQL and is rather easy to pick up.

For instance, using Mongo's shell, inserting a document representing a business card is done as follows:

db.business_cards.insert({name:"Andrew Glover", cell: "703-555-5555", fax: "703-555-0555", address: "29210 Corporate Dr, Suite 100, Anywhere USA"})

In this case, I've inserted a JSON document into a collection named business_cards by issuing an insert command on that collection directly. I can search the business_card collection via the find command like so:

db.business_cards.find({name:"Andrew Glover"})

This would return the document I just inserted. Plus, that document would contain Mongo's _id field, which was automatically generated upon insert. Note that Mongo's query language is closely analogous to SQL -- the same query in SQL would be something like:

select from business_cards where name = "Andrew Glover"

Mongo's query language supports a wide variety of searches, ranging from boolean expressions:

db.business_cards.find({$or: [{cell:"703-555-5555"}, {cell:"301-555-5555"}]})

This leverages a boolean OR and returns:

{ "_id" : ObjectId("4efb731168ee6a18692d86cd"), "name" : "Andrew Glover", "cell" : "703-555-5555", "fax" : "703-555-0555", "address" : "29210 Corporate Dr, Suite 100, Anywhere USA" }

{ "_id" : ObjectId("4efb73a868ee6a18692d86ce"), "name" : "Mark Smith", "cell" : "301-555-5555", "address" : "23 Corporation Way, Anywhere USA", "twitter" : "msmith" }

It also covers regular expressions:

db.business_cards.find({address: {$regex: ' corporat*', $options: 'i'}})

In return, you get two documents:

{ "_id" : ObjectId("4efb731168ee6a18692d86cd"), "name" : "Andrew Glover", "cell" : "703-555-5555", "fax" : "703-555-0555", "address" : "29210 Corporate Dr, Suite 100, Anywhere USA" }

{ "_id" : ObjectId("4efb73a868ee6a18692d86ce"), "name" : "Mark Smith", "cell" : "301-555-5555", "address" : "23 Corporation Way, Anywhere USA", "twitter" : "msmith" }

Naturally, Mongo supports updating documents and removing them. Updates are quite powerful, as there are a number of operations available for updating various aspects of a document. For instance, updating the cell number in a document containing the Twitter handle "msmith" would be performed as follows:

db.business_cards.update({twitter:"msmith"}, {$set: {cell:"202-555-5555"}})

In this case, the $set modifier changes a particular value in the first document matching the query. If all documents matching a query should be updated, additional parameters to the update command can be added.

Removing documents is similarly straightforward. Simply use the remove command and issue a query:

db.business_cards.remove({twitter:"msmith"})

Finally, Mongo offers MapReduce, a powerful searching algorithm for batch processing and aggregations that is somewhat similar to SQL's group by. At a high level, the MapReduce algorithm breaks a big task into two smaller steps. The map function is designed to take a large input and divide it into smaller pieces, then hand that data off to a reduce function, which distills the individual answers from the map function into one final output. For instance, MapReduce could be used in the business_card collection to determine how many documents contain a Twitter attribute.

| 1 2 3 4 Page 3
From CIO: 8 Free Online Courses to Grow Your Tech Skills
View Comments
Join the discussion
Be the first to comment on this article. Our Commenting Policies