Mongoid Sequence allows you to specify fields to behave like a sequence number (exactly like the "id" column in conventional SQL flavors).
This gem was inspired by a couple of gists by masatomo and ShogunPanda.
Include Mongoid::Sequence
in your class and call sequence(:field)
.
Like this:
class Sequenced
include Mongoid::Document
include Mongoid::Sequence
field :my_sequence, :type => Integer
sequence :my_sequence
end
s1 = Sequenced.create
s1.sequence #=> 1
s2 = Sequenced.create
s2.sequence #=> 2 # and so on
It is possible to add an additional discriminator to the sequence (e.g. a tenant id)
class Sequenced
include Mongoid::Document
include Mongoid::Sequence
field :my_sequence, :type => Integer
belongs_to :organization
sequence :my_sequence, prefix: :organization_id
end
If you have an embedded document, you don't have worrying about fake increment inside each child, mongoid-secuence will recognize this association and segregate the count per each child
class Sequenced
include Mongoid::Document
include Mongoid::Sequence
field :my_sequence, :type => Integer
embedded_in :parent
sequence :my_sequence
end
If you have an inheritance relation and you want to keep the sequence associated with one of your parents, you can specify what ancestors level you want using the parent_level option, below scenario will keep the sequence called parent_my_sequence sequence for Child instances
class Parent
include Mongoid::Document
include Mongoid::Sequence
field :my_sequence, :type => Integer
end
class Child
include Mongoid::Document
include Mongoid::Sequence
sequence :my_sequence, parent_level: 1
end
It's also possible to make the id
field behave like this:
class Sequenced
include Mongoid::Document
include Mongoid::Sequence
sequence :_id
end
s1 = Sequenced.create
s1.id #=> 1
s2 = Sequenced.create
s2.id #=> 2 # and so on
Mongoid::Sequence uses the atomic findAndModify command, so you shouldn't have to worry about the sequence's consistency.
Just add it to your projects' Gemfile
:
gem "mongoid-sequence"
Copyright © 2017 Gonçalo Silva, Johan Tique released under the MIT license