FoGhost / jmongo

A thin ruby wrapper around the mongo-java-driver for vastly better jruby performance

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Project JMongo

The Mongo project provides native bindings for most popular languages. For the ruby language,
the project has a pure ruby execution path and a C extension to handle some of the heavy
lifting. Unfortunately, the performance of the pure ruby path under jruby is less than
stellar. Additionally, the C extension isn't compatible with jruby so we aren't able to take
advantage of any native code boost.

JMongo solves this problem by putting a thin ruby wrapper around the mongo-java-driver. The
goal is to provide a drop-in replacement for the mongo and bson gems along with complete
API compatibility.

The initial version of this gem only wraps enough functionality to cover my personal use-cases.
I encourage project forking.

INSTALLATION
  % gem build jmongo.gemspec
  % gem install jmongo-0.1.0.gem


PROGRESS
The following methods have been ported and have at least basic functionality.

find
  - limit, skip and sort
find_one
last_status
insert

2010-10-16, Guy Boertje ported the following...

count
update
save
find_and_modify
create_index
ensure_index
drop_index
drop_indexes
drop_collection
drop_database
database_names

Also the returned objects are BSON::OrderedHash objects to match those of the regular ruby mongo library

rough benchmarks

drop collection 'bm' before and after mongo run

require 'rubygems'
require 'jmongo'
#require 'mongo'
require 'benchmark'
n = 500
db = Mongo::Connection.new('127.0.0.1',37037).db('bm')
coll = db.collection('bm')
ids = []
docs = []
Benchmark.bm do |x|
  x.report("inserts:") do
    for i in 1..n
      d = {'n'=>i}
      ids << coll.insert(d)
    end
  end
  x.report("updates:") do
    ids.each do |id|
      coll.update({'_id'=>id},{'$set'=>{'a'=>'blah'}})
    end
  end
  s = {'n'=>{'$gt'=>0}}
  coll.find(s).each{|d| }
  coll.find(s).each{|d| }
  c = coll.find(s)
  x.report("after find all, iterate:") do
    c.each do |d|
      docs << d
    end
  end
end
db.drop_collection('bm')

Results

ruby --fast --server mongo_bm.rb
                              user     system      total        real
                inserts:  0.879000   0.000000   0.879000 (  0.878000)
                updates:  0.711000   0.000000   0.711000 (  0.711000)
after find all, iterate:  0.243000   0.000000   0.243000 (  0.243000)

ruby --fast --server jmongo_bm.rb
                              user     system      total        real
                inserts:  0.489000   0.000000   0.489000 (  0.489000)
                updates:  0.357000   0.000000   0.357000 (  0.357000)
after find all, iterate:  0.058000   0.000000   0.058000 (  0.058000)


About

A thin ruby wrapper around the mongo-java-driver for vastly better jruby performance

License:Apache License 2.0