MongoSequence
MongoSequence provides light-weight, robust sequences in MongoDB. Such sequences are useful for auto-incrementing or counting. Compatible with any Mongo ODM.
MongoSequence creates named sequences in a "sequences" collection in your database and atomically increments and returns the counter on them using Mongo's findAndModify command. You won't have collisions—two processes trying to increment at the same time will always get different numbers.
Usage
Install with Bundler:
gem "mongo_sequence"
Install without Bundler:
gem install mongo_sequence --no-ri --no-rdoc
If you're not using MongoMapper or Mongoid, you'll have to tell MongoSequence what database to use:
MongoSequence.database = Mongo::Connection.new.db('my_app_development')
Now, increment some sequences:
MongoSequence[:global].next
MongoSequence[:global].next
MongoSequence[:global].current
MongoSequence[:global] = 100
MongoSequence[:global].next
MongoSequence[:bluejay].next
MongoSequence[:bluejay].next
Here's how the sequences look in Mongo:
MongoSequence.collection.find_one(:_id => 'bluejay')
Why?
Why would anyone need atomically incrementing sequences with unique return values? Well, the most common case is for auto-incrementing id's in Mongo. Here's a MongoMapper example:
class Peregrine
include MongoMapper::Document
key :_id, Integer, :default => lambda { nil }
before_create do
self.id ||= MongoSequence[:peregrine_id].next
self.id ||= MongoSequence[:mongo_id].next
end
end
Help make it better!
Need something added? Please open an issue! Or, even better, code it yourself and send a pull request:
# fork it on github, then clone:
git clone git@github.com:your_username/mongo_sequence.git
bundle install
rspec
# hack away
git push
# then make a pull request
Inspiration
A first implimentation was written over a year ago based on Chris Shiflett's Auto Increment with MongoDB blog post.
License
Authored by Brian Hempel. Public domain, no restrictions.