=================================================================== ===================================================================
Update Aug. 2010
On “Whyday”:http://whyday.org, I created a live demo of the examples, “that is running on Heroku”:http://mongodb-examples.heroku.com/.
=================================================================== ===================================================================
I am constantly looking around for different storage mechanisms on Heroku that can be used for caching 3rd party data. A recent update of their platform offered an MongoDB addon to access the MongoHQ service that drew my attention, so I started to evaluate this noSQL document database…
h2. MongoDB on OS X
It’s always a good starting point to have a local installation of a technology, here is how you get it running on your Mac with Homebrew:
brew install mongodb
# create a place for MongoDB to store the data
mkdir -p /data/db
# run server with default config (adapt to the right version)
mongod run --config /usr/local/Cellar/mongodb/1.4.4-x86_64/mongod.conf
Using MongoHQ requires a user-authentication, so it’s nice to have the same credentials on your local MongoDB instance:
# start the client
mongo
> use test
> db.addUser("test", "test")
h2. evaluating different APIs
A very basic approach, that basically wraps the MongoDB API into Ruby code is the Mongo Ruby Driver, but there are two higher level APIs close to ActiveRecord called Mongoid and MongoMapper.
h3. Mongo Ruby Driver
It’s pretty easy to connect to your MongoDB with the right connection string:
conn = Mongo::Connection.from_uri("mongodb://user:pass@host:port/db")
db = conn.db("db")
The Mongo Ruby Driver is very simple and close to the MongoDB API:
coll = db.collection('test')
coll.insert('a' => 1)
coll.find().each { |row| p row }
h3. MongoMapper
MongoMapper can also be accessed with a connection string:
Mongo::Connection.from_uri(MONGO_URL)
Instead of using ActiveRecord::Base MongoMapper provides the MongoMapper::Document module to handle the object document mapping. Since the structure of a document in MongoDB is open and not static like in a SQL database, you have to define the structure in code, so MongoMapper knows how to map the document to your Ruby objects:
class Person
include MongoMapper::Document
key :name, String
key :age, Integer
key :born_at, Time
key :active, Boolean
key :fav_colors, Array
connection Mongo::Connection.from_uri(MONGO_URL)
set_database_name 'basement'
end
person = Person.create({
:name => 'Nunemaker',
:age => 27,
:born_at => Time.mktime(1981, 11, 25, 2, 30),
:active => true,
:fav_colors => %w(red green blue)
})
person.save
Person.all.each do |p|
...
end
h3. Mongoid
Configuring Mongoid is somewhat different but easy:
Mongoid.database = Mongo::Connection.new(host, port).db(db)
Mongoid.database.authenticate(user, pass)
The DSL for defining Mongoid Documents is similar to MongoMapper and works mostly the same way. Querying the database is also similar to the API provided by ActiveRecord:
class Tweeter
include Mongoid::Document
field :user
embeds_many :tweets
end
class Tweet
include Mongoid::Document
field :status, :type => String
embedded_in :tweeter, :inverse_of => :tweets
end
tweet = Tweet.new(:status => "This is a tweet!")
tweet.tweeter = Tweeter.new(:user => 'ted')
tweet.save
Tweeter.all.each do |tweeter|
...
end
You can get the complete code and some more links from the GitHub project created for testing.
MongoDB is a great way to store document focused data and it’s simple to use with these great libraries!
Pingback: Using the Redis addon on Heroku | #nofail
Hello,
Do you happen to know how to find documents where its array field includes some value
Like Apple can red, yellow, and green, Banana can be yellow and green, orange is orange.
So I want all fruits that can be yellow, more or less like this:
Fruit.where(:colors.include => ‘yellow’) #=> [Apple, Banana]
Thanks@
for which driver?
for mongoid i would think this is
Fruit.any_in(:colors => ‘yellow’)
http://mongoid.org/docs/querying/
Pingback: Delicious Bookmarks for March 13th from 01:18 to 08:01 « Lâmôlabs